hibernate:如何映射Set关联以便保留HQL顺序

时间:2011-09-13 15:47:08

标签: java hibernate hql hibernate-mapping linkedhashset

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

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

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

如何使以下HQL工作:

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

我不想要的内容:

  • 在Java中使用sort(我们在SQL中有“order by”,所以我们不必这样做!)。排序集,比较器等是不可能的
  • 将其映射为带有<list-index>的列表。这将为所有SQL查询添加“order by”,我不想要这个
  • 使用<set order-by="orderIndex">,因为这将再次应用于所有查询

调试,我看到正在使用的Set的实现是org.hibernate.collection.PersistentSet,它包含Set。包裹的Set的实现是HashSet。我希望Hibernate足够聪明,可以使用LinkedHashSet,这样它就可以遵守我的“order by”HQL子句。

3 个答案:

答案 0 :(得分:2)

我很确定Hibernate无法为您执行此操作,并建议使用List代替。要删除联接引入的重复项,您可以使用 distinct 关键字。生成的List与任何Set一样好。

如果您仍然需要订购Set(可能还有第三方API),您可以创建自己的LinkedHashSet并将所有对象移到那里:

List<PageEntity> list = runQuery(...);
return new LinkedHashSet<PageEntity>(list);

答案 1 :(得分:0)

您似乎希望按q.orderIndex排序结果

  • 您希望对PageEntity的结果列表进行排序吗?
  • 或(我认为)您是否希望对每个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

应该这样做。