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

问题描述:

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

我将在示例表解释:

documentation: 
id_documentation 
irrelevant_data 

user: 
id_user 
irrelevant_data 


documentation_user: 
id_documentation 
id_user 
role 

我想达到什么是选择不具有用户在特定角色的每一个文档。有任何想法吗?

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

+0

也许这......有没有可能在ON子句中添加更多的join条件?例如: select * from documentation d left join documentation_user du ON d.id_documentation = du.id_documentation AND du.role = 2; – J33nn 2013-02-24 20:50:26

+1

是的,从Hibernate 3.5.0开始你可以。请参阅[此修复](https://hibernate.onjira.com/browse/HHH-2308) – dan 2013-02-24 20:57:21

+0

请问您可以告诉我如何使用CriteriaBuilder实现此目的? Root u = select.from(Documentation.class); 加入 dul = u.join(“documentationUserCollection”,JoinType.LEFT); – J33nn 2013-02-24 21:02:34

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

+0

更好的方法是将documentation_user与其他标准进行左连接,并检查id_user是否为空:select * from documentation d left join documentation_user du on d.id_documentation = du.id_documentation and du.role = 2其中,du.id_user为null; – J33nn 2013-02-24 21:10:58

+0

但我仍然不知道如何添加额外的条件来加入CriteriaBuilder。 – J33nn 2013-02-24 21:12:20

+0

在Criteria API中添加其他连接条件是不可能的。 – 2013-02-24 21:13:36

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

检查this回答有关如何将左连接与条件一起使用的示例。

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

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