Hibernate @ManyToMany未用关联表,生成笛卡尔积而非内连接问题求助
嘿,我来帮你拆解这个Hibernate @ManyToMany关联的查询问题!
问题根源
你当前的NamedQuery写法完全忽略了Project和Employee之间通过EMPLOYEE_PROJECTS中间表建立的关联关系,直接写了INNER JOIN Employee E ON E.external=:external——这种写法相当于把两个表做了无关联的笛卡尔积连接,Hibernate当然不会使用中间表,结果自然返回了所有Project,而不是你预期的仅Project#2。
修正JPQL查询
你需要利用Project实体中定义的employees集合来关联Employee,让Hibernate自动识别并使用中间表。修改后的NamedQuery应该是这样:
@NamedQueries( { @NamedQuery( name = "Projects.employeesByExternal", query = "SELECT DISTINCT P FROM Project P INNER JOIN P.employees E WHERE E.external=:external" ) } )
这里加上DISTINCT是为了防止同一个Project因为关联多个符合条件的Employee而被重复返回,保证结果的唯一性。
NativeQuery实现方式
如果一定要用NativeQuery,直接编写关联三个表的SQL即可,同样需要注意去重:
public List<Project> getProjectsByExternal(boolean isExternal) { String nativeSql = """ SELECT DISTINCT p.* FROM PROJECT p JOIN EMPLOYEE_PROJECTS ep ON p.ID = ep.PROJECT_ID JOIN EMPLOYEE e ON ep.EMPLOYEE_ID = e.ID WHERE e.EXT = :external """; Query query = entityManager.createNativeQuery(nativeSql, Project.class); query.setParameter("external", isExternal); return query.getResultList(); }
这段SQL明确通过中间表EMPLOYEE_PROJECTS关联Project和Employee,精准筛选出关联了至少一个ext=false的Employee的Project,DISTINCT确保每个Project只出现一次。
内容的提问来源于stack exchange,提问作者vzateychuk
相关产品推荐
相关产品推荐

