1

好的,这看起来很像 Hibernate 中的(另一个)错误/未实现的功能。

是否可以以尊重 HQL 中的子句的方式映射Set关联?"order by"

例如,假设您有 2 个实体:PageEntityQuestionEntity. 一个页面有一个集合。

如何使以下 HQL 工作:

from
    PageEntity p
        left outer join fetch p.questionEntities q
order by
    q.orderIndex

我不想要的:

  • 在 Java 中使用排序(我们在 SQL 中有“排序依据”,所以我们不必这样做!)。SortedSet、Comparators 等是不可能的
  • 将其映射为带有<list-index>. 这会将“order by”添加到所有 SQL 查询中,我不想要这个
  • 再次使用 a<set order-by="orderIndex">因为,这将应用于所有查询

调试时,我看到正在使用的 Set 的实现是org.hibernate.collection.PersistentSet包装了一个Set. 包装的实现SetHashSet. 我希望 Hibernate 足够聪明,可以使用 aLinkedHashSet代替,这样它就可以尊重我的 " order by" HQL 子句。

4

3 回答 3

2

我很确定 Hibernate 不能为你做到这一点,并建议使用 aList代替。要删除连接引入的重复项,您可以使用distinct关键字。结果List将与任何Set.

如果您仍然需要按顺序使用它们Set(可能涉及第 3 方 API),您可以创建自己的LinkedHashSet并将所有对象移到那里:

List<PageEntity> list = runQuery(...);
return new LinkedHashSet<PageEntity>(list);
于 2011-09-13T16:11:36.487 回答
0

看来你想得到排序的结果q.orderIndex但是

  • 您希望对结果列表PageEntity进行排序吗?
  • 或者(我认为)您是否希望QuestionEntity对每个 PageEntity 的 s 集进行排序?

如果您想要后者:SetJava 中的 s保留顺序。

编辑后:没有 Hibernate 不必很聪明:如果您将集合定义为 a Set,它将被视为一个集合。在许多应用程序中,保留订单会耗费资源并且不需要。

于 2011-09-13T15:53:50.180 回答
0

order by适用于查询的结果。不适用于问题集合中的实体。我不认为这是一个错误:如果返回的页面实体之一已经加载到会话中,使用另一个带有另一个 order by 子句的查询,它会做什么?

如果您想要问题的有序列表,请选择问题:

select q from QuestionEntity q inner join fetch q.page p order by q.orderIndex

或者

select p, q from PageEntity p
left outer join fetch p.questionEntities q 
order by q.orderIndex

应该做的伎俩。

于 2011-09-13T16:13:28.613 回答