Java 如何使用Hibernate标准';要查询嵌套表吗?

Java 如何使用Hibernate标准';要查询嵌套表吗?,java,hibernate,associations,criteria,Java,Hibernate,Associations,Criteria,我已经看遍了SO和Google,但我想我没有使用正确的搜索词或其他东西 无论如何,假设我有三张桌子: Companies ----------------------------------------- id name user_id Users ----------------------------------------- id username usertype_id UserTypes ----------------------------------------- id ty

我已经看遍了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);
列表=
crit.createCriteria(“用户”)
.createCriteria(“用户类型”)
.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();
Criteria crit=io.getSession().createCriteria(Company.class);
列表=
crit.createAlias(“用户”、“u”)
.createAlias(“u.usertypes”、“ut”)
.add(Restriction.eq(“ut.typeofuser”,“Stooge”).list();
似乎返回了完全相同的结果集。实际上我已经阅读了用户手册。当我只嵌套一层时(即,用户搜索就可以了)但是当我有两层的时候,我就不太明白了。手册也帮不了我。我就是不能把猫和小猫和商业物品联系起来。也许他们应该用猫,小猫和跳蚤-/


谢谢您的建议。

虽然您的查询应该可以正常工作,但下面是另一个变体:

 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();
Criteria crit=io.getSession().createCriteria(Company.class);
列表=
crit.createAlias(“用户”、“u”)
.createAlias(“u.usertypes”、“ut”、Criteria.INNER\u JOIN、,
限制条件(“ut.typeofuser”、“Stooge”)
.list();

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


请随意删除此问题。

thanX很多,您的答案为我节省了很多时间!哪种效率更高?内部联接还是添加?我认为没有一个直接的答案。如果表的数据有限,并且内部联接预先过滤不需要的数据,则效率会更高;否则我们需要处理/微调过滤条件我们还可以使用索引、分区和其他查询优化技术优化数据库配置。