java - 如何仅执行 "Distinct Root"但不为 JPA 生成不同的结果 SQL?

标签 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 将在构造结果列表时执行“不同根”转换。

我想知道是否有任何方法可以让我只使用第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/

相关文章:

hibernate - TransientObjectException - 对象引用未保存的 transient 实例 - 在刷新之前保存 transient 实例

java - Hibernate 抛出托管刷新异常

java - 错误: Unknown column 'DTYPE' in 'field list'

java - 如何找出一个文件当前是否在 Java 中增长(独立于操作系统)

java - 如何在 JavaFX 折线图上添加形状

java - WebLogic + Spring 的 JNDI 查找配置错误

java - Spring 4.1.0.RELEASE 和 Hibernate 4.3.6.Final 的依赖关系问题

java - 如果 TransactionProxyFactoryBean 用于服务层 bean 那么是否需要在 dao 中驱动事务注释?

java - Hibernate @事务 session

java - 处理任务的应用程序设计