Java / В спящем режиме: не Мог разрешить свойство с вложенным объектом criterias

Ответ Rob был бы самым агностическим поставщиком, но если бы Вы используете MySQL , более безопасным и корректным выбором было бы встроенное LAST_INSERT_ID() функция.

31
задан Stefan Birkner 12 March 2012 в 11:21
поделиться

2 ответа

Вы не можете использовать вложенные пути прямо в Criteria API (в отличие от HQL). Вместо этого вам нужно создать вложенные экземпляры критериев или определить псевдонимы для каждой пары «entity.property», начиная с первой некорневой сущности:

Criteria criteria = session.createCriteria(Enquiry.class)
 .createAlias("lecture", "l")
 .createAlias("l.admin", "a")
 .add( Restrictions.eqProperty("a.id", userId) );

Обратите внимание, что самое первое свойство не имеет префикса, поскольку оно принадлежит корневой сущности ( Запрос ), остальные имеют префикс с псевдонимом предыдущего уровня. Подробности в документации .

Также обратите внимание, что id - это особое свойство, когда дело касается ассоциаций; в вашем случае user_fk - это столбец, расположенный в таблице lecture . Следовательно, должно быть возможно (при условии, что сопоставления, которые вы опубликовали, точны) переписать вышеуказанные критерии как:

Criteria criteria = session.createCriteria(Enquiry.class)
 .createAlias("lecture", "l")
 .add( Restrictions.eqProperty("l.admin.id", userId) );

, таким образом исключив лишнее соединение.

76
ответ дан 27 November 2019 в 21:48
поделиться
Criteria crit = session.createCriteria(Enquiry.class)
crit.createAlias("lecture.admin", "lectureAdmin");
crit.add(Expression.eq("lectureAdmin.id", userId));

Вы действительно можете столкнуться с проблемами, если войдете слишком глубоко в граф объектов. Обычно я обхожу это, создавая псевдоним, как показано выше.

2
ответ дан 27 November 2019 в 21:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: