Ответ Rob был бы самым агностическим поставщиком, но если бы Вы используете MySQL , более безопасным и корректным выбором было бы встроенное LAST_INSERT_ID()
функция.
Вы не можете использовать вложенные пути прямо в 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) );
, таким образом исключив лишнее соединение.
Criteria crit = session.createCriteria(Enquiry.class)
crit.createAlias("lecture.admin", "lectureAdmin");
crit.add(Expression.eq("lectureAdmin.id", userId));
Вы действительно можете столкнуться с проблемами, если войдете слишком глубоко в граф объектов. Обычно я обхожу это, создавая псевдоним, как показано выше.