2012-11-09 66 views
3

我已經看過所有這些和谷歌,但我想我沒有使用正確的搜索字詞或什麼。如何使用Hibernate Criteria查詢嵌套表?

反正說我有三個表:

Companies 
----------------------------------------- 
id 
name 
user_id 

Users 
----------------------------------------- 
id 
username 
usertype_id 

UserTypes 
----------------------------------------- 
id 
typeofuser 

所以ACME將是一個公司,那就有一個用戶Moe和教育部將是一個Stooge用戶類型。

在SQL中,我會做這樣的事情:

select 
    * 
from companies c 
    join users u on (u.id = c.user_id) 
    join usertypes ut on (ut.id = u.usertype_id) 
where 
    ut.typeofuser = 'Stooge' 

但我似乎無法弄清楚如何做到這一點的標準。我曾嘗試過:

Criteria crit = io.getSession().createCriteria(Company.class); 
List<Company> list = 
    crit.createCriteria("users") 
     .createCriteria("usertypes") 
      .add(Restriction.eq("typeofuser", "Stooge").list(); 

但我回來的路太多記錄。結果甚至沒有接近準確。

我也試過:

Criteria crit = io.getSession().createCriteria(Company.class); 
List<Company> list = 
    crit.createAlias("users", "u") 
     .createAlias("u.usertypes", "ut") 
      .add(Restriction.eq("ut.typeofuser", "Stooge").list(); 

似乎帶回完全相同的結果集。我其實已經閱讀了用戶手冊。而當我只嵌入一層時(即用戶搜索很好),但是當我得到兩層深的時候,我無法完全理解它。手冊沒有幫助。我只是不能將貓和小貓與商業對象聯繫起來。也許他們應該使用貓,小貓和跳蚤? : -/

感謝您的任何建議。

回答

6

雖然您的查詢應該工作,下面是另一種變化:

Criteria crit = io.getSession().createCriteria(Company.class); 
List<Company> list = 
     crit.createAlias("users", "u") 
     .createAlias("u.usertypes", "ut", Criteria.INNER_JOIN, 
         Restrictions.eq("ut.typeofuser", "Stooge") 
     .list(); 
+0

thanX很多,你的回答爲我節省了很多時間! – Mehdi

+0

哪種效率更高? INNER_JOIN或添加? – jichi

+0

我不認爲這有一個直接的答案。如果表的數據有限且內部聯接預先過濾了不需要的數據,它將會很有效;否則我們需要處理/微調過濾器條件,以便在內存中獲得最佳數據需求/操作。我們還可以使用索引,分區和其他查詢優化技術來優化數據庫配置。 –

0

沒關係。我一直在做對。我在其他地方發生了錯誤。

請隨時刪除此問題。