Hibernate. Count запросы без HQL

The comment you are replying to does not exist.
  Tagged

Мне нравится пользоваться объектом 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(). Это то, что мне было интересно.

Америки не открыл, но вот опубликать решил. Может будет полезно кому-то.

Share this

Чем плох 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.

Оставьте новый коментарий

CAPTCHA
Бот ты или человек?
 
© 2006-2010 kobyleha.com