我现在使用 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 将在构造结果列表时执行“不同根”转换。
我想知道是否有任何方法可以让我只使用第2点(不同的根)(因为不同的结果SQL在我的情况下是不必要的,并且它会导致性能问题),最好是JPA-基于的解决方案?
此外,我可以在 Spring Data 上做一些事情来实现我正在寻找的东西吗? (例如,我可以使用任何 @QueryHint
或特殊的 JPQL/HQL 语法?)
(我知道一些解决方法,例如将结果设为 Set<A>
,但如果我找不到 JPA/Hibernate 针对此类情况提供的任何解决方案,我想将其用作最后的手段)
最佳答案
我一直用
session.createQuery("...")
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITIY)
.list();
关于java - 如何仅执行 "Distinct Root"但不为 JPA 生成不同的结果 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21925091/