2010-09-17 9 views
23

sous-requête que je dois faire cette requête SQL avec DetachedCriteria:Critères Hibernate

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) 

L'idée est d'obtenir les IDs des jeux qui ne sont pas la propriété de l'utilisateur. J'ai essayé comme 10 approches différentes avec DetachedCriteria mais je reçois la « entité inconnue: null » MappingException Le code devrait ressembler à:

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

fixeraient également les projections pour retourner uniquement l'identifiant des jeux.

Des idées? Je pense que Hibernate a du mal à rejoindre les requêtes sans alias. Ajout d'alias fonctionne mais les résultats sont tout à fait faux.

+0

N'appliquez-vous pas une association entre "games" et "user_games" dans vos objets/mappages? –

+0

user_games a un mapping pour les jeux mais pas viceversa – Gonzalo

Répondre

19

Vous devez ajouter un alias, comme suit:

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

Cela devrait aider

-3

Essayez

SELECT g.id FROM users_games ug join ug.game g 
WHERE NOT EXISTS (SELECT 1 FROM WHERE ug.user_id = 1) 
+5

Downvoting car la question de l'OP était de savoir comment faire cela en Hibernate, pas en SQL brut. Aussi le "FROM WHERE" serait une erreur de syntaxe dans SQL. –

11

Vous avez besoin d'une projection et précise quel attribut qui doit être adapté.

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

J'espère que cela aide.

Questions connexes