java - not - Subconsulta de criterios de hibernación
jpql join subquery (3)
Necesito hacer esta consulta SQL con 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)
La idea es obtener los ID de los juegos que no son propiedad del usuario. Probé como 10 enfoques diferentes con detachedCriteria pero obtengo la "MappingException" de "Entidad desconocida: nula":
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));
Configurando también las proyecciones para devolver solo el id de los juegos.
¿Algunas ideas? Creo que Hibernate tiene algunos problemas para unirse a las consultas sin alias. Añadir un alias funciona pero los resultados son bastante erróneos.
Es necesario agregar un alias, de la siguiente manera:
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"));
Eso debería ayudar
Necesita una proyección y especifica qué atributo debe coincidir.
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));
Espero que eso ayude.
Tratar
SELECT g.id FROM users_games ug join ug.game g
WHERE NOT EXISTS (SELECT 1 FROM WHERE ug.user_id = 1)