hibernate获取重复记录

时间:2018-04-17 11:11:37

标签: java hibernate spring-data-jpa

回过头来,我在使用内连接获取子实体时遇到了问题。

Not able to fetch child entities using inner join in spring data jpa

我现在面临的问题有点不同。

@Query("select 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);

使用@Fetch(FetchType.Join)

后,上面的代码正常工作
 @Query("select t1 from Department t1 inner join t1.employee t2 where t1.deptHead = :deptHead and t2.isActive != 'N')
    public List<Department> fetchDepartmentByActiveEmployees(@Param(deptId) Long deptId, @Param(deptHead) String deptHead);

当仅使用deptHead作为查询参数时,我将获得重复记录。

我的一个解决方案是使用Set for one-many mapping而不是list。

但是,如果我这样做,我必须做很多代码更改,我想避免。 还有其他选择吗?

enter image description here

当我用dept_head查询时,我应该得到一个大小为2的列表,而我得到的是大小为8的列表。

1 个答案:

答案 0 :(得分:-1)

您正在查询部门表,并且有4名员工属于该部门(dept_head = Ram),因此您将从部门表中获取重复记录

dept_head  dept_name    employee_name  
---------  -----------  ---------------
Ram        Electrical   X              
Ram        Electrical   Y              
Ram        Electronics  A              
Ram        Electronics  B  

您可以在查询之前使用 distinct子句来获取唯一的部门。

即使是正常的SQL查询也会返回相同的内容。 检查Here

 @Query("select distinct t1 from Department t1 inner join t1.employee t2 where t1.deptHead = :deptHead and t2.isActive != 'N')

正如@hadi j在评论中所建议的那样。