Hibernate查询重复记录问题及Spring Data JPA关联查询求助
解决Spring Data JPA关联查询返回重复Department实体的问题
这个问题在JPA关联查询里很常见——你通过inner join关联Department和Employee时,Hibernate会为每一对匹配的(Department, Employee)组合返回一条结果。如果一个部门下有多个符合isActive != 'N'条件的员工,同一个Department实例就会被重复返回多次。
下面是两种简单有效的解决方法,同时我也帮你修正了原始JPQL里的语法小问题:
方法1:用DISTINCT关键字去重
直接在select语句后添加DISTINCT,它会同时在SQL层面添加去重逻辑,并且在JPA层面确保返回的实体集合没有重复实例。修正后的代码如下:
@Query("select distinct t1 from Department t1 inner join t1.employee t2 where t1.deptHead = :deptHead and t1.departmentId = :deptId and t2.isActive != 'N'") public Department fetchDepartmentByActiveEmployees(@Param("deptId") Long deptId, @Param("deptHead") String deptHead);
方法2:结合Fetch Join加载关联实体(如果需要)
如果你不仅要查询Department,还希望一次性加载符合条件的Employee关联(避免后续N+1查询问题),可以用fetch join搭配DISTINCT:
@Query("select distinct t1 from Department t1 inner join fetch t1.employee t2 where t1.deptHead = :deptHead and t1.departmentId = :deptId and t2.isActive != 'N'") public Department fetchDepartmentByActiveEmployees(@Param("deptId") Long deptId, @Param("deptHead") String deptHead);
这里的fetch关键字会让Hibernate在查询Department的同时,把匹配条件的Employee也加载到内存中,DISTINCT依然用来避免重复的Department实体。
小提醒
你的原始JPQL语句末尾少了一个闭合括号,这会导致语法错误,上面的代码已经帮你修正了这个问题。
内容的提问来源于stack exchange,提问作者Tushar Banne
相关产品推荐
相关产品推荐

