当前位置: 首页 > 知识库问答 >
问题:

如何使用JPA和Hibernate修复"如果指定了SELECT DISTINCT,ORDER BY项必须出现在选择列表中"

吴伟志
2023-03-14

我在一个项目中工作,其中一个任务是创建动态查询,并有可能通过相关的懒惰的oneTo多项实体属性进行排序。我的第一次尝试是使用标准api,但是当我需要查询“非相关”字段时,我无法具体理解它,所以我切换到普通的JPQL,在那里我可以更清楚地表达自己

然而,普通JPQL似乎也有问题。其中一个用例是获取具有相关实体(例如join fetch)的AggregateRoot,其中谓词可以匹配AggregarRoot或相关实体属性的值。这同样适用于订购零件。现在还需要对结果进行分页。

我可以实现所有这些,但在执行查询时,我得到了“hh000104:firstResult/maxResults,指定为集合fetch;在内存中应用!”。在谷歌搜索之后,我最终进入了一个新的领域https://vladmihalcea.com/fix-hibernate-hhh000104-entity-fetch-pagination-warning-message/对其进行了解释,并提供了两种解决方案。第一个解决方案只是查询AggregateRoot的ID:s(不带join fetch),然后使用这些ID(带join fetch)查询实际的数据图。

现在出现了一个大问题,我需要能够根据一些聚合根字段或相关实体字段进行排序(所有这些都由用户界面决定)。我的第一个天真的解决方案只是“从聚合根中选择不同的a.id作为id......”但是当需要排序时,如果指定了SELECT DISTINCT,我必须在选择列表中显示ORDER BY项。经过一番思考,我意识到我可以创建所有可能的“排序”字段的投影(聚合根。ID是其中之一,在排序子句中作为最后手段使用,以使结果一致),然后从那里获取聚合根ID,以传递给实际的数据查询。然而,现在我结束了ORM阻抗不匹配的主要问题(如我所见)。基本上最后我有以下SQL

选择不同的aggregate0_. id作为col_0_0_,relatedEntity_. name作为col_6_0_从Aggregate Rootaggregate0_内连接related_entityrelatedEntity_aggregate0_. id=relatedEntity_。aggregate_idcol_6_0_DESC,col_0_0_偏移0行获取下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个)作为参数传递到实际的数据查询中。我还试图给出提示\u传递\u不同\u,如下所述https://vladmihalcea.com/jpql-distinct-jpa-hibernate/但我仍然只得到了2个聚合根ID(hibernate core版本为5.4.1.final)。任何建议都将不胜感激!

共有1个答案

茅昀
2023-03-14

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

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

使用从该查询中获取的ID,您可以使用第二个JPQL查询来连接获取根实体和子实体,如本文所述。

 类似资料:
  • 问题内容: 我知道以下查询会导致错误-如果指定了SELECT DISTINCT,则ORDER BY项目必须出现在选择列表中。 这是什么原因呢?实际发生了什么?如果我不使用DISTINCT或仅在SELECT或ORDER BY城市中添加生日,它会给我一些输出,但不会出现错误。是因为仅给出了与城市有关的结果集,而没有别的? 编辑-(我认为这可能是我的问题的答案) 考虑上面的查询。不确定,但是我认为这是这

  • 问题内容: 控制器逻辑: 服务逻辑 怎么了 在90%的情况下,这将正常工作。 问题 我已经阅读了相关问题,并找到了上面看到的电话。它解决了大约50%的案件,但不是全部。 问题答案: 对于我们来说,一些不同的方法最终解决了StaleObjectException定期发生的问题: 检索对象后刷新对象解决了我们的大多数StaleObjectExceptions。尤其是在某人可能会从其他地方处理同一对象并

  • 问题内容: 我想使用Hibernate选择单列而不是整个对象。到目前为止,我有这个: 我的问题是上述代码将整个People表返回为一个对象,而不仅仅是“ firstname”。我不确定如何指定仅返回“名字”而不是整个对象。 问题答案: 您可以像这样设置投影: 有了这个,您只能得到名字的回报。 我在同一情况下在堆栈上找到了另一个链接。希望这也将对您有所帮助。

  • 问题内容: 有3列:,, 如何将where的所有值都等于某个值,然后按进行排序,但不同的结果显示其对应的值呢? 我尝试了以下操作,但没有成功: 上述结果不会导致的不同值。如果我删除“ ”,则它将显示的不同值,但不会显示其相应的值。 那我该怎么办呢? 问题答案: 也许是这样的: ? 您可以在此SQL Fiddle中使用它。

  • 问题内容: 我们希望对Seam EntityQuery接口和JPA模型中的2列进行排序。我们如何做到这一点? 问题答案: 如果您正在谈论,则此注释会将(目标实体的)逗号分隔属性的列表作为参数,并相应地对集合进行排序。例如,您的情况。 根据JPA 1.0规范: 9.1.28 OrderBy批注 的注释指定的集合的元素的顺序在点值的关联时的关联检索。 值排序元素的语法为orderby_list,如下所

  • 问题内容: 在Java Swing中具有每个复选框的项目列表的最佳方法是什么? 即是一个JList,其中每个项目都有一些文本和一个复选框? 问题答案: 创建一个自定义并将其分配给。 此自定义必须在方法的实现中返回a 。 但这将是不可编辑的,因为屏幕上的简单绘画取决于您何时必须“勾选”, 例如,在选中该行时将其选中(参数),但如果选择更改,则不会保留检查状态。最好在下方显示参考数据进行检查,但是您可