Критерии Hibernate Подзапрос - PullRequest
       5

Критерии Hibernate Подзапрос

23 голосов
/ 17 сентября 2010

Мне нужно выполнить этот 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, но получаю 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 есть проблемы с присоединением к запросам без псевдонима.Добавление псевдонима работает, но результаты совершенно неверны.

Ответы [ 3 ]

19 голосов
/ 06 июля 2011

Вам необходимо добавить псевдоним, как показано ниже:

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"));

Это должно помочь

11 голосов
/ 06 марта 2013

Требуется проекция и указывается, какой атрибут должен соответствовать.

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));

Надеюсь, это поможет.

0 голосов
/ 12 ноября 2012

Попробуйте

SELECT g.id FROM  users_games ug join ug.game g
WHERE NOT EXISTS (SELECT 1 FROM WHERE ug.user_id = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...