休眠条件排序依据
Posted
技术标签:
【中文标题】休眠条件排序依据【英文标题】:Hibernate Criteria Order By 【发布时间】:2011-07-04 00:14:24 【问题描述】:我有一个名为 Gift 的表,它与一个名为 ClickThrough 的表具有一对多的关系,该表指示该特定 Gift 被点击了多少次。我需要查询所有按 ClickThrough 计数排序的 Gift 对象。我不需要返回 ClickThrough 计数,因为我不需要对它进行任何处理,我只想将其用于订购目的。
我需要查询直接返回礼物对象列表,只是按点击次数排序。如何使用 Criteria API 执行此操作?我可以在那里找到很多与此类似的信息的文档,但与我需要的完全不一样。
【问题讨论】:
您可以为课程发布您的实体吗? 【参考方案1】:请注意,其他任何人通过此处希望按属性/列订购:
使用此处提到的方法时,未找到任何结果。解决方法是改用criteria.addOrder(Order.asc(property));
。注意区别在于使用addOrder
,而不是add
;
在此处运行以供快速参考后,我已经多次遇到此问题。
【讨论】:
这对我有用。接受的答案将要求您将 Order.desc 转换为没有意义的 Criterion。【参考方案2】:如果您想返回实体或属性列表以及计数,则需要分组依据。在标准中,这是通过ProjectionList
和Projections
完成的。例如
final ProjectionList props = Projections.projectionList();
props.add(Projections.groupProperty("giftID"));
props.add(Projections.groupProperty("giftName"));
props.add(Projections.count("giftID"), "count"); //create an alias for the count
crit.setProjection(props);
crit.add(Order.desc("count")); //use the count alias to order by
但是,由于您使用的是ProjectionList
,因此您还需要使用AliasToBeanConstructorResultTransformer。
【讨论】:
我还没有机会尝试,但这听起来很合理。一旦有机会尝试,我会报告。谢谢! 我试了一下,我得到一个“PropertyNotFoundException:找不到计数的设置器”,我猜是因为“计数”没有映射到我的礼物对象中。我希望 AliasToBeanConstructorResultTransformer 会忽略它找不到设置器的任何东西,但我想不会。 不,需要一个计数设置器。最干净的方法是创建一个类 GiftView,它只具有您实际需要的 Gift 属性 + 计数。这更像是一个 DTO,而不是一个实体。或者您可以将计数添加为 Gift 的瞬态属性。 好的,所以我为计数添加了一个 setter,现在我正在取得一些进展。我正在取回一个礼物对象列表,但除了计数属性外,它们都是空的。事实证明,我必须使用 props.add(Projections.groupProperty("giftID"), "giftID") 而不是 props.add(Projections.groupProperty("giftID")) 才能使转换器工作。 但是,现在它只检索我在投影列表中包含的属性。这很好,除了来自礼物的任何 1-* 关系的集合属性。现在所有这些都设置了一个空的 Set 对象,并且不会发生延迟实例化。我该如何解决这个问题?【参考方案3】:您从 Gift 到 ClickThrough 是一对多的关系,因此我假设每个 ClickThrough 都是一条记录,其中包含一些日期时间或其他相关信息。在这种情况下,我会在映射文件中添加一个“计数”字段并将排序附加到条件:
criterion.add(Order.asc(count)))
映射属性类似于:
<property name="count" type="integer" formula="(select count(*) from Gift g inner join ClickThrough ct on ct.gift_id=g.id where g.id=ID)"/>
如果您不能或不想更改映射文件,您可以使用 Collections.sort()
和 Comparator
,尽管从数据库返回这么多数据似乎效率较低。
【讨论】:
以上是关于休眠条件排序依据的主要内容,如果未能解决你的问题,请参考以下文章