Hibernate Criteria Order By

时间:2011-02-25 01:17:16

标签: java hibernate criteria

我有一个名为Gift的表,它与一个名为ClickThrough的表有一对多的关系 - 表示特定Gift被点击的次数。我需要查询按ClickThrough计数排序的所有Gift对象。我不需要返回ClickThrough计数,因为我不需要做任何事情,我只想将它用于订购目的。

我需要查询直接返回一个Gift对象列表,只是按ClickThrough计数排序。如何使用Criteria API执行此操作?我可以在这里找到类似信息的大量文档,但没有什么比我需要的更多。

3 个答案:

答案 0 :(得分:28)

请注意,此处的任何其他人都希望通过酒店/列进行订购:

使用此处提到的方法时,未找到任何结果。修复方法是使用criteria.addOrder(Order.asc(property));代替。请注意,区别在于使用addOrder,而不是add;

我在这里跑了几次以便快速参考这个问题。

答案 1 :(得分:10)

如果要返回实体或属性列表以及计数,则需要一个分组依据。在条件中,这是通过ProjectionListProjections完成的。 e.g。

    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

答案 2 :(得分:0)

你有一个从Gift到ClickThrough的一对多关系,所以我假设每个ClickThrough都是一个记录,其中包含一些日期时间或与之相关的其他信息。在这种情况下,我会在映射文件中添加一个“count”字段,并将排序附加到标准:

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一起使用,但是从DB返回这么多数据似乎效率不高。< / p>