Spring Data JPA(Spring Boot 2)多表关联查询相关问题咨询
问题解答
1. 关联查询方法的存放位置
直接放在EmployeeRepository中即可。你的查询主表是EMPLOYEE,最终返回的也是Employee实体的字段,和主实体绑定的Repository是最合理的存放位置,不需要额外修改其他两个Repository的代码。
2. JPQL对NOLOCK关键字的支持情况
JPQL本身不直接支持数据库特有的WITH(NOLOCK)锁提示语法,因为JPQL是为了跨数据库兼容性设计的抽象查询语言,不会兼容某一种数据库的专属语法。
如果必须保留NOLOCK的特性,有两种可行方案:
- 直接使用原生SQL查询,在SQL语句中保留原有的
WITH(NOLOCK)写法 - 为查询方法添加事务隔离级别配置,将当前查询的隔离级别设置为读未提交,效果和NOLOCK一致
3. 原生SQL转Spring Data JPA实现方案
可以转换,有两种实现方式,按需选择即可:
方案1:使用原生SQL查询(推荐入门使用,不需要修改实体关联配置)
直接在EmployeeRepository中添加如下方法即可,不需要改动原有实体:
@Query(value = "SELECT A.EMPL_ID, A.HIRE_DT FROM HR.EMPLOYEE A WITH(NOLOCK) INNER JOIN HR.EMPLOYEE_POS B WITH(NOLOCK) ON A.SEQ_NO = B.SEQ_NO INNER JOIN HR.EMPLOYEE_ACN C WITH(NOLOCK) ON A.SEQ_NO = C.SEQ_NO WHERE A.EMPLOYEE_STATUS in ('ACTIVE') AND B.JOB_GRP='IT' AND C.ACN IN ('HIRE') ORDER BY A.HIRE_DT ASC", nativeQuery = true) List<Object[]> queryActiveItHireEmployees();
如果需要封装为DTO返回,还可以结合@SqlResultSetMapping配置做结果映射。
方案2:使用JPQL查询(需要先配置实体关联关系)
首先需要在Employee实体中配置和另外两个实体的关联关系,示例配置如下:
// Employee.java中添加关联字段 @OneToMany(mappedBy = "employee") private List<EmployeePosition> positions; @OneToMany(mappedBy = "employee") private List<EmployeeAction> actions; // EmployeePosition.java中添加关联 @ManyToOne @JoinColumn(name = "SEQ_NO", referencedColumnName = "SEQ_NO") private Employee employee; // EmployeeAction.java中添加关联 @ManyToOne @JoinColumn(name = "SEQ_NO", referencedColumnName = "SEQ_NO") private Employee employee;
之后在EmployeeRepository中添加JPQL查询方法:
@Query("SELECT e.emplId, e.hireDt FROM Employee e JOIN e.positions p JOIN e.actions a WHERE e.employeeStatus = 'ACTIVE' AND p.jobGrp = 'IT' AND a.acn = 'HIRE' ORDER BY e.hireDt ASC") List<Object[]> queryActiveItHireEmployees();
注意:该方案无法直接添加NOLOCK锁提示,需要搭配锁hint或者事务隔离级别配置实现同等效果
内容的提问来源于stack exchange,提问作者Andulos
相关产品推荐
相关产品推荐

