Directorio de artículos
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:
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.