Получить запись с максимальным идентификатором, используя Hibernate Criteria - PullRequest
30 голосов
/ 10 октября 2010

Используя Hibernate * Criteria API , я хочу выбрать запись в таблице с максимальным значением для данного столбца.

Я пытался использовать Проекции , , создающие псевдоним для max(colunName), затем использующие его в restrictions.eq(), но он продолжает сообщать мне " неверное число ".

Как правильно сделать это с помощью Hibernate?

Ответы [ 8 ]

36 голосов
/ 10 октября 2010

Вы можете использовать DetachedCriteria для выражения подзапроса, что-то вроде этого:

DetachedCriteria maxId = DetachedCriteria.forClass(Foo.class)
    .setProjection( Projections.max("id") );
session.createCriteria(Foo.class)
    .add( Property.forName("id").eq(maxId) )
    .list();

Ссылки

22 голосов
/ 09 августа 2012

Я обнаружил, что совместное использование addOrder и setMaxResults сработало для меня.

Criteria c = session.createCriteria(Thingy.class);
c.addOrder(Order.desc("id"));
c.setMaxResults(1);
return (Thingy)c.uniqueResult();

Используя диалект MySQL, это создает подготовленный SQL-запрос примерно так (вырезая некоторые поля):

select this_.id ... from Thingy this_ order by this_.id desc limit ?

Я не уверен, будет ли это решение эффективным для диалектов, отличных от MySQL.

6 голосов
/ 07 сентября 2011

Используйте

addOrder(Order.desc("id"))

и получите только первый результат:)

1 голос
/ 10 октября 2010

HQL:

from Person where person.id = (select max(id) from Person)

Не проверено.Ваша база данных должна понимать подвыборы в предложении where.

Лень выяснить, может ли такой подвыбор быть выражен с помощью критериев api.Конечно, вы можете выполнить два запроса: сначала получить максимальный идентификатор, а затем объект с этим идентификатором.

0 голосов
/ 30 апреля 2018

Чтобы сделать это полностью с Отдельными Критериями (потому что я люблю строить отдельные критерии без сеанса)

DetachedCriteria maxQuery = DetachedCriteria.forClass(Foo.class)
    .setProjection( Projections.max("id") );
DetachedCriteria recordQuery = DetachedCriteria.forClass(Foo.class)
    .add(Property.forName("id").eq(maxId) );
0 голосов
/ 21 декабря 2017
    Date maxDateFromDB = null;
    Session session = (Session) entityManager.getDelegate();
//Register is and Entity and assume maxDateFromDB is a column.
//Status is another entity with Enum Applied.
//Code is the Parameter for One to One Relation between Register and Profile entity.
    Criteria criteria = session.createCriteria(Register.class).setProjection(Projections.max("maxDateFromDB") )
    .add(Restrictions.eq("status.id", Status.Name.APPLIED.instance().getId()));
    if(code != null && code > 0) {
        criteria.add(Restrictions.eq("profile.id", code));
    }
    List<Date> list = criteria.list();

    if(!CollectionUtils.isEmpty(list)){
        maxDateFromDB = list.get(0);
    }
0 голосов
/ 18 июня 2015

Более чистое решение также будет:

DetachedCriteria criteria = DetachedCriteria.forClass(Foo.class).setProjection(Projections.max("id"));
Foo fooObj =(Foo) criteria.getExecutableCriteria(getCurrentSession()).list().get(0);
0 голосов
/ 01 декабря 2010

Для функции max() в спящем режиме:

criteria.setProjection(Projections.max("e.encounterId"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...