2012-11-09 40 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

没关系。我一直在做对。我在其他地方发生了错误。

请随时删除此问题。