【问题标题】:Hibernate Criteria Subquery休眠条件子查询
【发布时间】:2011-04-13 21:43:58
【问题描述】:

我需要使用 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。 我用 detachedCriteria 尝试了 10 种不同的方法,但我得到了“未知实体: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 在加入没有别名的查询时遇到了一些麻烦。 添加别名有效,但结果非常错误。

【问题讨论】:

  • 您没有在您的对象/映射中映射“游戏”和“用户游戏”之间的关联吗?
  • user_games 映射到游戏,但反之则不然

标签: java hibernate subquery


【解决方案1】:

需要添加别名,如下:

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

应该有帮助

【讨论】:

    【解决方案2】:

    您需要一个投影并指定需要匹配的属性。

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

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      试试

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

      【讨论】:

      • 拒绝投票,因为 OP 的问题是关于如何在 Hibernate 中执行此操作,而不是在原始 SQL 中。此外,“FROM WHERE”将是 SQL 中的语法错误。
      猜你喜欢
      • 2011-06-08
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2012-03-17
      相关资源
      最近更新 更多