Использование Hibernate и Критерии для выбора наиболее распространенного значения - PullRequest
2 голосов
/ 14 мая 2011

Учитывая таблицу, скажем:

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

И у меня есть Order объект, который имеет Type объект (Type имеет Set из Order s в другом направлении.

Как мне получить самые популярные Type из Order (в данном случае, типа 1), используя Criteria API Hibernate?

Ответы [ 2 ]

2 голосов
/ 14 мая 2011

Я взглянул на документацию по 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 голос
/ 14 мая 2011

Вы можете посмотреть на Проекции .Вы должны иметь возможность использовать Projection.groupProperty () для ассоциации типа и суммировать результаты.проверьте этот вопрос: Выражения в критериях гибернации

edit: пробовал, и, кажется, следующее работает нормально:

Order:

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