Uso conjunto de la vista de objetos de la base de datos, el procedimiento almacenado y Spring Data JPA

1. Vista de acceso JPA

Dado que la vista es una tabla virtual, el acceso de la vista es similar al de la tabla general, los datos de la base de datos se muestran en la siguiente figura:

Inserte la descripción de la imagen aquí
El código de implementación específico es el siguiente:
Defina la vista:

create view view_users 
as
select*from user

Clase de modelo:

@Entity
@Table(name="view_users")
@Data
public class User implements Serializable {
    
    
	private static final long serialVersionUID = 1L;
	@Id
	private String id;
	private String name;
	private String password;
	private String sex;
}

Interfaz del repositorio:

public interface UserRepository extends JpaRepository<User, String> {
    
    
	@Query(value="select*from view_users",nativeQuery=true)
	List<User> findUserByUserView();
}

Interfaz e implementación del servicio:

public interface IUserService {
    
    
	public List<User> findUsers();
}

@Service(value="userService_entityManager")
public class UserServiceImpl implements IUserService {
    
    

	@Autowired
	private UserRepository userRepository;
 
	@Override
	public List<User> findUsers() {
    
    
		List<User> users=userRepository.findUserByUserView();
		return users;
	}
}

Clase de controlador:

@RestController
public class UserController {
    
    
	@Autowired
	@Qualifier(value="userService_entityManager")
	private IUserService userService;

	@RequestMapping(value="/users",method=RequestMethod.GET)
	public ResponseEntity<List<User>> findUsers(){
    
    
		return ResponseEntity.ok(userService.findUsers());
	}
}

Resultados del:

[{"id":"001","name":"rhine","password":"28e5ea71eb6600afb02132dcf27b8e75","sex":null},{"id":"002","name":"xixi","password":"xxxx","sex":null}]

2, acceso JPA a procedimientos almacenados

2.1, el procedimiento almacenado que devuelve el conjunto de resultados

Defina el procedimiento almacenado:

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_users`()
BEGIN
	SELECT *FROM user;
END

Clase de modelo:

@Data
@Entity
@NamedStoredProcedureQuery(
			name = "user.list", 
			procedureName = "proc_users",
			resultClasses= {
    
    UserProcParam.class})
public class UserProcParam{
    
    
	@Id
	private String id;
	@Column(name="name")  // 
	private String userName;
	private String password;
	private String sex;
}

Dado que los campos en nuestra clase de entidad son inconsistentes con los campos en la base de datos, hay dos formas de resolverlos: la
primera: use @Column (nombre = "[el nombre del campo en la base de datos]") la
segunda: Use la anotación @SqlResultSetMapping, la implementación específica es la siguiente:

@Data
@Entity
@NamedStoredProcedureQuery(
			name = "user.list", 
			procedureName = "proc_users",
			resultSetMappings= "userMapping"
	)
@SqlResultSetMapping(
		name="userMapping",
		entities= {
    
    @EntityResult(entityClass=UserProcParam.class,fields= {
    
    
				@FieldResult(name="id",column="id"),
				@FieldResult(name="userName",column="name"),
				@FieldResult(name="password",column="password"),
				@FieldResult(name="sex",column="sex"),
				})}
)
public class UserProcParam{
    
    
	@Id
	private String id;
	private String userName;
	private String password;
	private String sex;
}

Interfaz de la capa de servicio y clase de implementación:

public interface IUserService {
    
    	
	public List<UserProcParam> findUsersByProc();
}

@Service(value="userService_entityManager")
public class UserServiceImpl implements IUserService {
    
    
    @PersistenceContext
    private EntityManager entityManager;

	@Override
	public List<UserProcParam> findUsersByProc() {
    
    
		StoredProcedureQuery store = this.entityManager.createNamedStoredProcedureQuery("user.list");
		List<UserProcParam> list=store.getResultList();
		return list;
	}

Aquí se omite la clase de implementación de la capa de controlador.

2.2, un procedimiento almacenado que devuelve un solo valor

Definir un procedimiento almacenado

CREATE DEFINER=`root`@`localhost` PROCEDURE `NewProc`(OUT num INT)
BEGIN
	DECLARE number int;
	SELECT COUNT(*) INTO number FROM user;
	SET num=number;
END

Clase de modelo:

@Data
@Entity
@NamedStoredProcedureQuery(name="user.count",procedureName="proc_users_total",parameters= {
    
    
		@StoredProcedureParameter(mode=ParameterMode.OUT, name="num", type=Integer.class)
	})
public class UserProcParam{
    
    
	@Id
	private String id;
	@Column(name="name")
	private String userName;
	private String password;
	private String sex;
}

Interfaz de la capa de servicio y clase de implementación:

public interface IUserService {
    
    
	int findUsersCountByProc();
}

@Service(value="userService_entityManager")
public class UserServiceImpl implements IUserService {
    
    
    @PersistenceContext
    private EntityManager entityManager;
   
	@Override
	public int findUsersCountByProc() {
    
    
		StoredProcedureQuery store = this.entityManager.createNamedStoredProcedureQuery("user.count");
		int count=(int) store.getOutputParameterValue("num");
		return count;
	}
}

Se omite la capa de controlador.

Supongo que te gusta

Origin blog.csdn.net/qgnczmnmn/article/details/109331635
Recomendado
Clasificación