使用Hibernate和Criteria选择最常见的值

时间:2011-05-14 11:52:00

标签: java hibernate criteria-api

给出一张表,说:

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

我有一个Order对象,其Type个对象(Type在另一个方向上有Set Order个。

如何使用Hibernate的Criteria API检索最受欢迎的Type Order(在本例中为1)?

2 个答案:

答案 0 :(得分:2)

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

这可能需要修改才能使用适当的类

答案 1 :(得分:1)

你可能想看看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]);
    }