Критерии гибернации - PullRequest
       7

Критерии гибернации

14 голосов
/ 25 февраля 2011

У меня есть таблица с именем Gift, которая имеет отношение «один ко многим» к таблице с именем ClickThrough, которая указывает, сколько раз был нажат этот конкретный подарок. Мне нужно запросить все объекты Gift, упорядоченные по количеству кликов через. Мне не нужно возвращать счетчик ClickThrough, поскольку мне ничего не нужно делать с ним, я просто хочу использовать его для целей заказа.

Мне нужен запрос для непосредственного возврата объектов List of Gift, только что упорядоченных по счетчику ClickThrough. Как мне сделать это с помощью Criteria API? Я могу найти много документации, похожей на эту, но ничего такого, что мне нужно.

Ответы [ 3 ]

28 голосов
/ 12 декабря 2013

Примечание для всех, кто просматривает здесь, ищет порядок по свойству / столбцу:

При использовании подходов, упомянутых здесь, никаких результатов не найдено.Исправление должно было использовать criteria.addOrder(Order.asc(property)); вместо.Обратите внимание, что разница заключается в использовании addOrder, а не add;

У меня была эта проблема несколько раз после запуска здесь для краткого справочника.

10 голосов
/ 10 марта 2011

Если вы хотите вернуть список объектов или свойств в сочетании с количеством, вам понадобится группировать по. В критериях это делается через ProjectionList и Projections. например,

    final ProjectionList props = Projections.projectionList();
    props.add(Projections.groupProperty("giftID"));
    props.add(Projections.groupProperty("giftName"));
    props.add(Projections.count("giftID"), "count"); //create an alias for the count
    crit.setProjection(props);

    crit.add(Order.desc("count")); //use the count alias to order by

Однако, поскольку вы используете ProjectionList, вам также нужно будет использовать AliasToBeanConstructorResultTransformer .

0 голосов
/ 25 февраля 2011

У вас есть отношение «один ко многим» от Gift до ClickThrough, поэтому я предполагаю, что каждый ClickThrough - это запись с некоторой датой или другой информацией, связанной с ней. В этом случае я бы добавил поле «количество» в ваш файл сопоставления и прикрепил бы порядок к критерию:

criterion.add(Order.asc(count)))

Свойство сопоставления выглядит примерно так:

<property name="count" type="integer" formula="(select count(*) from Gift g inner join ClickThrough ct on ct.gift_id=g.id where g.id=ID)"/>

Если вы не можете или не хотите изменять файл сопоставления, вы можете использовать Collections.sort() с Comparator, хотя кажется менее эффективным возвращать столько данных из БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...