barbitoff programmer`s blog

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

пятница, 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`а в БД, тогда как составной ключ не требует никаких объединений т.к. является просто группировкой полей в отдельный объект.

1 комментарий: