好的,这看起来很像Hibernate中的(另一个)bug /未实现的功能。
是否可以以尊重HQL中的Set
子句的方式映射"order by"
关联?
例如,假设您有2个实体:PageEntity
和QuestionEntity
。页面有一个Set。
如何使以下HQL工作:
from
PageEntity p
left outer join fetch p.questionEntities q
order by
q.orderIndex
我不想要的内容:
<list-index>
的列表。这将为所有SQL查询添加“order by”,我不想要这个<set order-by="orderIndex">
,因为这将再次应用于所有查询调试,我看到正在使用的Set的实现是org.hibernate.collection.PersistentSet
,它包含Set
。包裹的Set
的实现是HashSet
。我希望Hibernate足够聪明,可以使用LinkedHashSet
,这样它就可以遵守我的“order by
”HQL子句。
答案 0 :(得分:2)
我很确定Hibernate无法为您执行此操作,并建议使用List
代替。要删除联接引入的重复项,您可以使用 distinct
关键字。生成的List
与任何Set
一样好。
如果您仍然需要订购Set
(可能还有第三方API),您可以创建自己的LinkedHashSet
并将所有对象移到那里:
List<PageEntity> list = runQuery(...);
return new LinkedHashSet<PageEntity>(list);
答案 1 :(得分:0)
您似乎希望按q.orderIndex
排序结果
PageEntity
的结果列表进行排序吗?QuestionEntity
s进行排序?如果你想要后者:Java中的Set
使不保留顺序。
编辑后:没有Hibernate不必智能:如果您将集合定义为Set
,它将被视为一个集合。有许多应用程序可以保留订单成本资源而不需要。
答案 2 :(得分: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
应该这样做。