【问题标题】:Using Hibernate and Criteria to Select the Most Common Value使用 Hibernate 和 Criteria 选择最常见的值
【发布时间】:2011-08-25 11:45:26
【问题描述】:

给定一张桌子,说:

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

我有一个Order 对象,它有一个Type 对象(Type 在另一个方向有一个SetOrders。

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

【问题讨论】:

    标签: java hibernate criteria-api


    【解决方案1】:

    您可能想查看Projections。您应该能够在“类型”关联上使用Projections.groupProperty(),并将结果相加。 检查这个 SO 问题:Expressions in hibernate criteria

    edit: 试过了,以下似乎工作正常:

    订单:

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

    【讨论】:

    • 对不起。我的问题措辞错误。 OrderType 具有多对一关系。
    • 我更改了答案以反映这一点,但标准几乎相同;)
    • 美女。我能够根据您所拥有的信息自行解决,但认为您可能想更新您的答案:)
    • 实际上,这对我不起作用。我必须这样做才能让它工作:Criteria c = sess.createCriteria(Type.class); c.createCriteria("orders"); 这对你有意义吗?
    • 您似乎有从类型到订单的一对多,而不是从订单到类型的多对一。这就是为什么你的 Type 类上有一个属性“orders”。检查这个:stackoverflow.com/questions/2584521/…
    【解决方案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();
    

    这可能需要修改以使用正确的类

    【讨论】:

    • 如果 Type 是一个关联类,您必须首先在该关联上创建一个 Criteria 才能访问它的 id。类似createCriteria(Order.class).createCriteria("types");
    • 对不起,我的问题措辞有误。已修订。
    猜你喜欢
    • 2011-10-07
    • 2017-01-22
    • 2018-01-23
    • 2013-07-24
    • 2016-05-09
    • 1970-01-01
    • 2013-05-10
    • 2012-06-20
    相关资源
    最近更新 更多