queries not criteriabuilder java hibernate subquery

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)