Подтвердить что ты не робот

Получить запись с максимальным id, используя критерии Hibernate

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

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

Какой правильный способ сделать это с Hibernate?

4b9b3361

Ответ 1

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

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

Ссылки

Ответ 2

Я обнаружил, что использование 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.

Ответ 3

Использование

addOrder(Order.desc("id"))

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

Ответ 4

HQL:

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

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

Слишком ленив, чтобы узнать, может ли/или какой такой подзадач быть выражен с критериями api. Конечно, вы могли бы выполнить два запроса: сначала выберите max id, затем объект с этим идентификатором.

Ответ 5

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

DetachedCriteria criteria = DetachedCriteria.forClass(Foo.class).setProjection(Projections.max("id"));
Foo fooObj =(Foo) criteria.getExecutableCriteria(getCurrentSession()).list().get(0);

Ответ 6

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

Ответ 7

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

criteria.setProjection(Projections.max("e.encounterId"));