我现在使用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
据我所知,这将导致两种影响:
- 结果SQL将包含
distinct
关键字 - 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();