选择连接表中没有特定记录的记录

时间:2013-02-24 20:42:38

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

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

我将在示例表中解释:

documentation:
id_documentation
irrelevant_data

user:
id_user
irrelevant_data


documentation_user:
id_documentation
id_user
role

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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

检查this答案,了解如何使用符合条件的左连接。

答案 2 :(得分: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)));

另见this useful answer on SO