2010-09-17 196 views
23

我需要這樣做SQL查詢用的DetachedCriteria: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) 

的想法是從沒有被用戶所擁有的遊戲獲得的ID。 我試着像的DetachedCriteria 10點不同的方法,但我得到的「未知實體:空」 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)); 

設置也預測只返回遊戲的ID。

任何想法? 我認爲Hibernate在加入沒有別名的查詢時遇到了一些麻煩。 添加別名的作品,但結果是相當錯誤的。

+0

你是不是在映射你的對象/映射「遊戲」和「user_games」之間的關聯? – 2010-09-17 20:35:06

+0

user_games映射到遊戲但不是反之亦然 – Gonzalo 2010-10-18 14:10:20

回答

19

您需要添加一個別名,如下所示:

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

這應該有助於

-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是因爲OP的問題是關於如何在Hibernate中執行此操作,而不是在原始SQL中操作。同樣,「FROM WHERE」將是SQL中的語法錯誤。 – 2014-11-12 16:52:25

11

你需要一個投影,並指定要匹配哪個屬性。

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

我希望有幫助。