java - 如何使用 JPA 和 Hibernate 修复 "ORDER BY items must appear in the select list if SELECT DISTINCT is specified"

标签 java hibernate jpa orm spring-data

我正在一个项目中工作,其中一项任务是创建动态查询,并可以按相关的惰性 oneToMany 实体属性进行排序。我的第一次尝试是使用 Criteria-api,但我无法理解它,特别是当我需要查询“不相关”字段时,因此我切换到普通 JPQL,这样我可以更清楚地表达自己

但是,普通 JPQL 似乎也存在问题。用例之一是获取具有相关实体的 AggregateRoots(例如连接获取),其中谓词可以匹配 AggregareRoot 或相关实体属性的值。这同样适用于订购部分。现在结果也需要分页

我可以实现所有这些,但是当执行查询时,我得到“HHH000104:使用集合获取指定的firstResult/maxResults;在内存中应用!”。经过一番谷歌搜索后,我最终进入 https://vladmihalcea.com/fix-hibernate-hhh000104-entity-fetch-pagination-warning-message/对其进行了解释并提供了 2 个解决方案。第一个解决方案只是查询 AggregateRoots 的 ID:(没有连接获取),然后使用这些 ID 查询实际的数据图(有连接获取)。

现在出现了大问题,我需要能够按一些聚合根字段或相关实体字段(全部由 UI 指定)进行排序。我的第一个天真的解决方案只是“从AggregateRoot中选择不同的a.id作为id...”但是当它需要排序时我得到了ORDER BY items must appear in the select list if SELECT DISTINCT is specified 。经过一番思考后,我意识到我可以创建所有可能的“排序依据”字段的投影(AggregateRoot.ID 是其中之一,用作排序依据子句中的最后手段以使结果一致),然后从那里获取 AggregateRoot ID传递给实际的数据查询。然而现在我遇到了 ORM 阻抗不匹配的主要问题(正如我所见)。基本上最后我有以下类型的 SQL

选择 不同的aggregate0_.id为col_0_0_, relatedEntity_.name 为 col_6_0_ 从 聚合根aggregate0_ 内部联接 related_entity relatedEntity_ 在aggregate0_.id=relatedEntity_.aggregate_id上 订购依据 col_6_0_ DESC, col_0_0_ offset 0 rows 仅获取接下来的 3 行

最终会得到结果

<html>
<head>
<style>
table, th, td {
  border: 1px solid black;
}
</style>
</head>
<body>
<table>
<tr>
<td><b>col_0_0_</b></td><td><b>col_6_0_</b></td>
</tr>
<tr>
<td>1</td><td>CCC</td>
</tr>
<tr>
<td>1</td><td>BBB</td>
</tr>
<tr>
<td>2</td><td>AAA</td>
</tr>
</table>
</body>
</html>

所以现在我只有 2 个唯一 ID(而不是 3 个)作为参数传递到实际数据查询中。我还尝试按照此处所述给出提示 HINT_PASS_DISTINCT_THROUGH https://vladmihalcea.com/jpql-distinct-jpa-hibernate/但我仍然只得到 2 个聚合根 ID(hibernate-core 版本为 5.4.1.final)。任何建议将不胜感激!

最佳答案

为第一个查询编写派生表:

select t.id 
from (
    select id, col1, col2
    from root_table
    where ...
    order by col1, col2
    fetch first 50 rows only
) t

使用从此查询中获取的 ID,您可以使用第二个 JPQL 查询来加入获取根实体和子实体,如 this post 中所述。 .

关于java - 如何使用 JPA 和 Hibernate 修复 "ORDER BY items must appear in the select list if SELECT DISTINCT is specified",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54927348/

相关文章:

java - HQL返回数据类型

java - 集成 JPA 和 PostgreSQL 空列

Java: hibernate @OneToOne 映射

java - 创建名为 'entityManagerFactory' :java. lang.NoSuchMethodError : javax. persistence.Table.indexes() 的 bean 时出错

java - 如何在Spring数据JPA中获取结果集中的列名

java - 在java中的mongo查询中使用distinct

java - 使用 volatile 确保 Java 中共享(但不是并发)数据的可见性

java - 递归 G(n) 函数错误

java - Hibernate 在 varbinary 类型的列上加入实体?

java - 为什么默认禁用 hibernate batching/order_inserts/order_updates?