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

发布于 11-06 20:41 字数 375 浏览 4 评论 0原文

给定一个表,假设:

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

我有一个 Order 对象,它有一个 Type 对象(Type 有一个 Set另一个方向的 Order 数,

我将如何使用来检索 Order 中最流行的 Type(在本例中为类型 1)。 Hibernate 的 Criteria API?

Given a table, say:

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

And I have an Order object which has a Type object (Type has a Set of Orders in the other direction.

How would I go about retrieving the most popular Type of Order (in this case, type 1) using Hibernate's Criteria API?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

━╋う一瞬間旳綻放2024-11-13 20:41:45

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

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

I took a look at the documentation of the Hibernate Criteria API, could you do something like this:

List results = session.createCriteria(Order.class)
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount(),"rCount")
        .add( Projections.groupProperty("typeId") )
    )
    .addOrder(Order.desc("rCount") )
    .setMaxResults(1)
    .list();

This may need modified to work with the proper classes

々眼睛长脚气2024-11-13 20:41:45

你可能想看看投影。您应该能够使用 Projections.groupProperty( ) 在“类型”关联上,并将结果相加。
检查这个SO问题: 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]);
    }

you might wanna look into Projections. You should be able to use Projections.groupProperty() on the "type" association, and add up the results.
check this SO question: Expressions in hibernate criteria

edit: tried it and the following seems to work fine:

Order:

@Entity
@Table(name="orders")
public class Order {
    @Id
    @GeneratedValue
    private long id;
    @ManyToOne
    private Type type;
}

Type:

@Entity
@Table(name="order_types")
public class Type {
    @Id
    @GeneratedValue
    private long id;
}

and the Criteria:

    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]);
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文