如何只执行"Distinct Root"而不在 JPA 的结果 SQL 中生成不同的结果 SQL?



我现在使用Spring Data JPA+Hibernate作为数据访问层。

假设我有实体A,它与B具有一到五的关系。

当我试图查询A加入获取B时,我的第一次尝试是这样的:

from A a join fetch a.b

然而,因为A.b是一对多的,所以对于JPA和Hibernate的工作方式,结果List<A>将包含指向同一个A实例的多个元素(因为结果列表中的每个元素将对应于结果集中的一行)。

解决方法是编写

select distinct a from A a join fetch a.b

据我所知,这将导致两种影响:

  1. 结果SQL将包含distinct关键字
  2. JPA/Hibernate在构建结果列表时会进行"Distinct Root"转换

我想知道是否有任何方法可以使第2点(Distinct Root)生效(因为在我的情况下,结果中的不同SQL是不必要的,它会导致性能问题),最好是基于JPA的解决方案?

此外,我能在Spring Data上做些什么来实现我想要的目标吗?(例如,我可以使用任何@QueryHint或特殊的JPQL/HQL语法?)

(我知道一些变通方法,比如将结果设为Set<A>,但如果我找不到JPA/Hibernate为这种情况提供的任何解决方案,我想将其作为最后手段)

我一直使用

session.createQuery("...")
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITIY)
.list();

最新更新