2010-09-17 10 views
23

Ich brauche diese SQL-Abfrage mit DetachedCriteria zu tun:Hibernate Criteria Subquery

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) 

Die Idee ist, die IDs von den Spielen zu erhalten, die nicht im Besitz des Benutzers ist. Ich habe versucht, wie 10 verschiedene Ansätze mit DetachedCriteria aber ich habe die „Unbekannte Einheit: null“ MappingException Der Code sollte wie folgt aussehen:

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

Rahmen die Projektionen auch zurück nur die ID der Spiele.

Irgendwelche Ideen? Ich denke, Hibernate hat Probleme, die Abfragen ohne Alias ​​zu verbinden. Hinzufügen von Alias ​​funktioniert, aber die Ergebnisse sind ziemlich falsch.

+0

Ordnen Sie in Ihren Objekten/Mappings keine Assoziation zwischen "Spielen" und "User_Games" zu? –

+0

user_games hat eine Zuordnung zu Spielen, aber nicht umgekehrt – Gonzalo

Antwort

19

Sie benötigen einen Alias ​​hinzuzufügen, wie folgt:

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

Das

-3

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

Downvoting, weil die Frage von OP war, wie man das in Hibernate tut, nicht in roher SQL. Auch das "FROM WHERE" wäre ein Syntaxfehler in SQL. –

11

Sie benötigen einen Vorsprung und gibt an Versuchen sollte helfen, das Attribut, das angepasst werden muss.

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

Ich hoffe, dass hilft.

Verwandte Themen