Java 选择在联接表中没有特定记录的记录

Java 选择在联接表中没有特定记录的记录,java,mysql,many-to-many,criteria-api,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创建查询,所以我认为使

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

我将在示例表中解释:

documentation:
id_documentation
irrelevant_data

user:
id_user
irrelevant_data


documentation_user:
id_documentation
id_user
role
我想要实现的是选择没有特定角色的每个文档。有什么想法吗


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

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

您可以使用以下方法在左侧连接上添加限制:createAliasjava.lang.String、java.lang.String、int、org.hibernate.Criteria.Criteria方法,请参阅


有关如何使用带条件的左连接的示例,请查看答案。

尝试类似以下未测试代码的操作:

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

另请参见。

也许这。。。是否有可能在ON子句中添加更多的连接条件?例如:选择*from documentation d left join documentation\u user du ON d.id\u documentation=du.id\u documentation和du.role=2;是的,从Hibernate 3.5.0开始,您可以。你能告诉我如何用CriteriaBuilder实现这一点吗?根u=select.fromDocumentation.class;Join-dul=u.joindocumentationUserCollection,JoinType.LEFT;更好的方法是使用附加的on条件左键连接documentation_user,并检查id_user是否为null:从documentation d中选择*左键连接documentation_user du on d.id_documentation=du.id_documentation,du.role=2,其中du.id_user为null;但我仍然不知道如何在CriteriaBuilder中添加附加条件。无法在CriteriaAPI中添加附加条件。请告诉我如何添加?找不到这个。