我需要使用detachedCriteria执行此SQL查询:
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。 我尝试了10种不同的方法与detachedCriteria,但我得到“未知的实体:null”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 :(得分: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"));
那应该有帮助
答案 1 :(得分: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));
我希望有所帮助。
答案 2 :(得分:-4)
尝试
SELECT g.id FROM users_games ug join ug.game g
WHERE NOT EXISTS (SELECT 1 FROM WHERE ug.user_id = 1)