3

我已经查看了 SO 和 Google,但我想我没有使用正确的搜索词或其他东西。

无论如何,假设我有三张桌子:

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 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();

似乎带回了完全相同的结果集。我实际上已经阅读了用户手册。当我只嵌套一层时(即,用户搜索很好)但是当我得到两层时,我就不太明白了。手册没有帮助。我只是无法将猫和小猫与商业对象联系起来。也许他们应该使用猫、小猫和跳蚤?:-/

感谢您的任何建议。

4

2 回答 2

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();
于 2012-11-09T22:49:42.727 回答
0

没关系。我一直都做对了。我在其他地方出错了。

随意删除这个问题。

于 2012-11-09T22:50:30.563 回答