Hibernate. Count запросы без HQL
Мне нравится пользоваться объектом Criteria для составления запросов. Очень удобно и наглядно, гораздо лучше чем писать запрос в виде HQL. Приведу пример:
@SuppressWarnings("unchecked")
public List<LogAdd> findAddLogs(Long minLogID) {
Criteria criteria = session.createCriteria(LogAdd.class);
criteria.add(Restrictions.gt("id", minLogID));
criteria.addOrder(Order.asc("date"));
return criteria.list();
}
До недавнего времени приходилось использовать HQL только для запросов типа "count". Так как просто взять размер массива, означает достать все объекты из базы и только потом считать сколько их, а это нас явно не устраивает.
А вот недавно нашел метод как выполнять count запросы используя Criteria объект:
public Integer countAddLogs(Long minLogID) {
Criteria criteria = session.createCriteria(LogAdd.class);
criteria.add(Restrictions.gt("id", minLogID));
criteria.setProjection(Projections.rowCount());
return (Integer) criteria.list().get(0);
}
Обратите внимание на Projections.rowCount(). Это то, что мне было интересно.
Америки не открыл, но вот опубликать решил. Может будет полезно кому-то.
Чем плох HQL? public
Чем плох HQL?
public Integer countAddLogs(Long minLogID) { return (Integer)session.createQuery("select coun(id) count from LogAdd where id = :minLogID") .setLong("minLogID", minLogID) .uniqueResult(); }Вместо
Вместо criteria.list().get(0) наверно будет правильней использовать criteria.uniqueResult().
Но есть один недостаток у критериев - при использовании rowCount() всегда возвращается Integer, при этом если PK объявлен как Long - критерий все равно будет тупо возвращать Integer(версия 3.2.5, судя по changelog в 3.2.6 не пофиксили). Поэтому приходится использовать обычный HQL.
Оставьте новый коментарий