我现在使用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
根据我的理解,这会产生两种效果:
distinct
关键字我想知道是否有任何方法我只有第2点(Distinct Root)生效(因为在我的情况下结果SQL不同,并且它导致性能问题),最好是JPA-基于解决方案?
此外,我可以在Spring Data上做些什么来实现我想要的东西吗? (例如,我可以使用任何@QueryHint
或特殊的JPQL / HQL语法吗?)
(我知道一些解决方法,比如将结果设为Set<A>
,但如果我找不到JPA / Hibernate提供的任何解决方案,我会想用它作为最后的手段)
答案 0 :(得分:1)
我一直使用
session.createQuery("...")
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITIY)
.list();