Подзапрос критериев гибернации
Мне нужно сделать этот SQL-запрос с detachedCriteria:
SELECT g.id FROM games g
WHERE NOT EXISTS (
SELECT 1 FROM users_games ug WHERE ug.user_id = 1 AND g.id = ug.game_id)
Идея состоит в том, чтобы получить идентификаторы из игр, которые не принадлежат пользователю.
Я пробовал как 10 различных подходов с detachedCriteria, но я получаю "Неизвестный объект: null" MappingException
Код должен выглядеть так:
DetachedCriteria subquery = DetachedCriteria.forClass(UserGame.class, "ug")
.add(Restrictions.eq("ug.user.id", 1))
.add(Restrictions.eqProperty("ug.game.id","u.id"));
DetachedCriteria criteria = DetachedCriteria.forClass(Game.class, "g")
.add(Subqueries.notExists(subquery));
Установка также проекций для возврата только идентификатора игр.
Любые идеи?
Я думаю, что Hibernate имеет некоторые проблемы с присоединением к запросам без псевдонимов.
Добавление псевдонима работает, но результаты совершенно неверны.
Ответы
Ответ 1
Вам нужно добавить псевдоним следующим образом:
DetachedCriteria subquery = DetachedCriteria.forClass(UserGame.class, "ug")
.addAlias("ug.user", "user")
.add(Restrictions.eq("user.id", 1))
.addAlias("ug.game", "game")
.add(Restrictions.eqProperty("game.id","u.id"));
Это должно помочь
Ответ 2
Вам нужна проекция и укажите, какой атрибут нужно сопоставить.
DetachedCriteria subquery = DetachedCriteria.forClass(UserGame.class, "ug")
.add(Restrictions.eq("ug.user.id", 1))
.add(Restrictions.eqProperty("ug.game.id","u.id"))
.setProjection(Projections.property("ug.game.id"));
DetachedCriteria criteria = DetachedCriteria.forClass(Game.class, "g")
.add(Property.forName("g.id").notIn(subquery));
Я надеюсь, что это поможет.
Ответ 3
Try
SELECT g.id FROM users_games ug join ug.game g
WHERE NOT EXISTS (SELECT 1 FROM WHERE ug.user_id = 1)