如何只执行“Distinct Root”但不在JPA的结果SQL中生成不同的?

时间:2014-02-21 04:07:31

标签: java hibernate jpa spring-data

我现在使用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”转换。
  3. 我想知道是否有任何方法我只有第2点(Distinct Root)生效(因为在我的情况下结果SQL不同,并且它导致性能问题),最好是JPA-基于解决方案?

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

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

1 个答案:

答案 0 :(得分:1)

我一直使用

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