0

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

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

documentation:
id_documentation
irrelevant_data

user:
id_user
irrelevant_data


documentation_user:
id_documentation
id_user
role

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

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

4

3 回答 3

0

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

于 2013-02-24T21:08:17.030 回答
0

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

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

于 2013-02-24T21:24:13.813 回答
0

尝试这样的事情(代码未测试):

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

另请参阅SO 上的这个有用的答案

于 2013-02-25T10:02:44.083 回答