2011-05-14 53 views
2

给定一个表,说:使用Hibernate和标准来选择最常用的值

orderId | typeId 
---------------- 
1  | 1 
2  | 1 
3  | 2 
4  | 5 
5  | 1 
6  | 2 

而且我有一个Order对象具有Type对象(Type具有OrderSet A S在另一个方向。

我怎么会去使用Hibernate的标准API获取最流行的OrderType(在这种情况下,1型)?

回答

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]); 
    } 
+0

对不起工作。我误解了我的问题。 'Order'与'Type'有着多对一的关系。 – 2011-05-14 14:29:55

+0

我改变了答案反映,但标准是几乎相同;) – fasseg 2011-05-14 14:39:43

+0

美女。我能够自己弄清楚你的所作所为,但认为你可能想更新你的答案:) – 2011-05-14 14:51:40

2

我看了一下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(); 

这可能需要修改与正确类

+0

如果类型是关联的类,您将不得不在该关联上创建一个标准,首先访问它的标识。就像'createCriteria(Order.class).createCriteria(“types”);' – fasseg 2011-05-14 12:20:20

+0

对不起,我误解了我的问题。修订。 – 2011-05-14 14:28:33