2013-02-24 70 views
0

嗨我試圖從一個表中選擇記錄,該記錄沒有連接具有特定值的多對多表中的記錄。在連接表中選擇沒有特定記錄的記錄

我將在示例表解釋:

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

回答

0

主要問題不存在 - 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

0

您可以使用以下方法在左連接上添加限制:createAlias(java.lang.String, java.lang.String, int, org.hibernate.criterion.Criterion)方法,請參閱API

檢查this回答有關如何將左連接與條件一起使用的示例。

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