Artigo Diretório
1. Visualização de acesso JPA
Como a visão é uma tabela virtual, o acesso da visão é semelhante ao da tabela geral. Os dados do banco de dados são mostrados na figura a seguir:
O código de implementação específico é o seguinte:
Defina a visualização:
create view view_users
as
select*from user
Classe 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;
}
Interface do repositório:
public interface UserRepository extends JpaRepository<User, String> {
@Query(value="select*from view_users",nativeQuery=true)
List<User> findUserByUserView();
}
Interface de serviço e implementação:
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;
}
}
Classe do 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 de:
[{"id":"001","name":"rhine","password":"28e5ea71eb6600afb02132dcf27b8e75","sex":null},{"id":"002","name":"xixi","password":"xxxx","sex":null}]
2. JPA acessa o procedimento armazenado
2.1, um procedimento armazenado que retorna um conjunto de resultados
Defina o procedimento armazenado:
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_users`()
BEGIN
SELECT *FROM user;
END
Classe 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;
}
Como os campos em nossa classe de entidade são inconsistentes com os campos no banco de dados, existem duas maneiras de resolvê-los:
Primeiro: use @Column (name = "[nome do campo no banco de dados]")
Segundo: Use a anotação @SqlResultSetMapping, a implementação específica é a seguinte:
@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;
}
Interface da camada de serviço e classe de implementação:
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;
}
A classe de implementação da camada do controlador é omitida aqui.
2.2, um procedimento armazenado que retorna um único valor
Defina um procedimento armazenado
CREATE DEFINER=`root`@`localhost` PROCEDURE `NewProc`(OUT num INT)
BEGIN
DECLARE number int;
SELECT COUNT(*) INTO number FROM user;
SET num=number;
END
Classe 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;
}
Interface da camada de serviço e classe de implementação:
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;
}
}
A camada do controlador é omitida.