【问题标题】:Select records which doesn't have specific records in joined table选择联接表中没有特定记录的记录
【发布时间】:2013-02-24 20:42:38
【问题描述】:

您好,我正在尝试从一个表中选择记录,该表在连接的多对多表中没有具有特定值的记录。

我将在示例表上进行解释:

documentation:
id_documentation
irrelevant_data

user:
id_user
irrelevant_data


documentation_user:
id_documentation
id_user
role

我想要实现的是选择每个没有特定角色的用户的文档。有什么想法吗?

主要问题是我使用 java 的 CriteriaBuilder 来创建查询,所以使用子查询是不可能的(我认为)。

【问题讨论】:

  • 也许这... 是否有可能在 ON 子句中添加更多连接条件?例如:select * from documentation d left join documentation_user du ON d.id_documentation = du.id_documentation AND du.role = 2;
  • 是的,从 Hibernate 3.5.0 开始就可以了。见this fix
  • 您能告诉我如何使用 CriteriaBuilder 实现这一目标吗? Root u = select.from(Documentation.class); Join dul = u.join("documentationUserCollection", JoinType.LEFT);

标签: java mysql many-to-many criteria-api


【解决方案1】:

您可以使用createAlias(java.lang.String, java.lang.String, int, org.hibernate.criterion.Criterion) 方法对左连接添加限制,请参阅API

查看this 答案以获取有关如何将左联接与条件一起使用的示例。

【讨论】:

    【解决方案2】:

    主要问题不存在 - 标准 API 确实有 SubQuery。查询本身选择 User 的实例并使用 not in 构造来限制基于子查询的结果。子查询选择通过 DocumentationUser 连接到具有特定角色的文档的所有用户。

    【讨论】:

    • 更好的方法是左加入documentation_user并附加附加条件并检查id_user是否为空:select * from documentation d left join documentation_user du on d.id_documentation = du.id_documentation and du.role = 2 where du.id_user 为空;
    • 但我仍然不知道如何添加附加条件以加入 CriteriaBuilder。
    • 无法在 Criteria API 中添加额外的连接条件。
    • 你能告诉我怎么做吗?找不到这个。
    【解决方案3】:

    试试这样的(代码未测试):

    CriteriaQuery<Documentation> cq = cb.createQuery(Documentation.class);
    Root<Documentation> u = cq.from(Documentation.class);
    Subquery<Integer> sq = cq.subquery(Integer.class);
    Root<User> su = sq.from(User.class);
    sq.select(su.get("id_user"));
    Join<User, DocumentationUser> du = su.join("documentationUserCollection");
    sq.where(cb.equals(du.get("role"), "mySpecificRole"));
    cq.where(cb.not(cb.in(u.get("id_user")).value(sq)));
    

    另见this useful answer on SO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多