我有一个名为Gift的表,它与一个名为ClickThrough的表有一对多的关系 - 表示特定Gift被点击的次数。我需要查询按ClickThrough计数排序的所有Gift对象。我不需要返回ClickThrough计数,因为我不需要做任何事情,我只想将它用于订购目的。
我需要查询直接返回一个Gift对象列表,只是按ClickThrough计数排序。如何使用Criteria API执行此操作?我可以在这里找到类似信息的大量文档,但没有什么比我需要的更多。
答案 0 :(得分:28)
请注意,此处的任何其他人都希望通过酒店/列进行订购:
使用此处提到的方法时,未找到任何结果。修复方法是使用criteria.addOrder(Order.asc(property));
代替。请注意,区别在于使用addOrder
,而不是add
;
我在这里跑了几次以便快速参考这个问题。
答案 1 :(得分:10)
如果要返回实体或属性列表以及计数,则需要一个分组依据。在条件中,这是通过ProjectionList
和Projections
完成的。 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>