给定一张桌子,说:
orderId | typeId
----------------
1 | 1
2 | 1
3 | 2
4 | 5
5 | 1
6 | 2
我有一个Order
对象,它有一个Type
对象 (在另一个方向Type
有一个Set
of Order
s 。
我将如何使用 Hibernate 的 Criteria API检索最流行Type
的(在本例中为类型 1)?Order
给定一张桌子,说:
orderId | typeId
----------------
1 | 1
2 | 1
3 | 2
4 | 5
5 | 1
6 | 2
我有一个Order
对象,它有一个Type
对象 (在另一个方向Type
有一个Set
of Order
s 。
我将如何使用 Hibernate 的 Criteria API检索最流行Type
的(在本例中为类型 1)?Order
我看了一下 Hibernate Criteria API 的文档,你能做这样的事情吗:
List results = session.createCriteria(Order.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount(),"rCount")
.add( Projections.groupProperty("typeId") )
)
.addOrder(Order.desc("rCount") )
.setMaxResults(1)
.list();
这可能需要修改以使用正确的类
你可能想看看Projections。您应该能够在“类型”关联上使用Projections.groupProperty(),并将结果相加。检查这个 SO 问题:休眠条件中的表达式
编辑:尝试过,以下似乎工作正常:
命令:
@Entity
@Table(name="orders")
public class Order {
@Id
@GeneratedValue
private long id;
@ManyToOne
private Type type;
}
类型:
@Entity
@Table(name="order_types")
public class Type {
@Id
@GeneratedValue
private long id;
}
和标准:
Criteria c=sess.createCriteria(Order.class)
.createCriteria("type")
.setProjection(
Projections.projectionList()
.add(Projections.groupProperty("id"))
.add(Projections.rowCount(),"rowcount")
)
.addOrder(org.hibernate.criterion.Order.desc("rowcount"));
for (Object[] result:(List<Object[]>) c.list()){
System.out.println("type id: " + result[0] + "\tcount: " + result[1]);
}