barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)
Показаны сообщения с ярлыком Criteria API. Показать все сообщения
Показаны сообщения с ярлыком Criteria API. Показать все сообщения

пятница, 6 июля 2012 г.

Hibernate: ошибка "Criteria objects cannot be created directly on components. Create a criteria on owning entity and use a dotted property to access component property"

Ошибка "Criteria objects cannot be created directly on components.  Create a criteria on owning entity and use a dotted property to access component property" возникает при попытке создания дочернего элемента Criteria для поля, представляющего не ассоциацию, а составной ключ:
Criteria childCriteria = criteria.createCriteria("id");
, где поле id класса, которому соответствует объект criteria, ссылается на объект составного ключа. 
В случае составных ключей, нет необходимости создания дочерних объектов Criteria, накладывать условия на поля составного ключа или выполнять по ним сортировку можно просто используя точку:
criteria.addOrder(Order.asc("id.timestamp"));
criteria.add(Restrictions.gt("id.timestamp",new Date()));
Кстати, создавать псевдонимы через criteria.createAlias для поля составного ключа тоже нельзя, т.к. createAlias предполагает выполнения JOIN`а в БД, тогда как составной ключ не требует никаких объединений т.к. является просто группировкой полей в отдельный объект.

вторник, 19 июня 2012 г.

Hibernate Criteria API: подсчет числа строк (аналог SQL COUNT)

Чтобы получить число строк, соответствующих определенному Criteria, нужно установить соответствующую проекцию:
Criteria criteria = session.createCriteria(theClass);
...
criteria.setProjection(Projections.rowCount());
long rowCount = (Long)criteria.uniqueResult();
Здесь rowCount - число строк, которое возвратил бы вызов criteria.list(), будучи вызванным без установки проекции.