我看了SO和谷歌,但我想我没有使用正确的搜索词或其他东西。
无论如何,我说有三张桌子:
Companies
-----------------------------------------
id
name
user_id
Users
-----------------------------------------
id
username
usertype_id
UserTypes
-----------------------------------------
id
typeofuser
因此ACME
将是一家公司,它将拥有一个用户Moe
,而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中做到这一点。我试过了:
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();
似乎带回完全相同的结果集。我实际上已经阅读了用户手册。当我只嵌套一层深度(即用户搜索很好)但是当我得到两层深度时,我无法得到它。手册没有帮助。我只是无法将猫和小猫与业务对象联系起来。也许他们应该使用猫,小猫和跳蚤? : - /
感谢您的任何建议。
答案 0 :(得分: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();
答案 1 :(得分:0)
没关系。我一直在做这件事。我在其他地方遇到了错误。
随意删除此问题。