给定一个表,说:使用Hibernate和标准来选择最常用的值
orderId | typeId
----------------
1 | 1
2 | 1
3 | 2
4 | 5
5 | 1
6 | 2
而且我有一个Order
对象具有Type
对象(Type
具有Order
的Set
A S在另一个方向。
我怎么会去使用Hibernate的标准API获取最流行的Order
Type
(在这种情况下,1型)?
给定一个表,说:使用Hibernate和标准来选择最常用的值
orderId | typeId
----------------
1 | 1
2 | 1
3 | 2
4 | 5
5 | 1
6 | 2
而且我有一个Order
对象具有Type
对象(Type
具有Order
的Set
A S在另一个方向。
我怎么会去使用Hibernate的标准API获取最流行的Order
Type
(在这种情况下,1型)?
你migh我想看看Projections。您应该能够在“类型”关联上使用Projections.groupProperty(),并将结果相加。 检查这太问题:Expressions in hibernate criteria
编辑:尝试过了,下面似乎很好地工作:
订单:
@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]);
}
我看了一下Hibernate的标准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();
这可能需要修改与正确类
如果类型是关联的类,您将不得不在该关联上创建一个标准,首先访问它的标识。就像'createCriteria(Order.class).createCriteria(“types”);' – fasseg 2011-05-14 12:20:20
对不起,我误解了我的问题。修订。 – 2011-05-14 14:28:33
对不起工作。我误解了我的问题。 'Order'与'Type'有着多对一的关系。 – 2011-05-14 14:29:55
我改变了答案反映,但标准是几乎相同;) – fasseg 2011-05-14 14:39:43
美女。我能够自己弄清楚你的所作所为,但认为你可能想更新你的答案:) – 2011-05-14 14:51:40