【问题标题】:How can I use Hibernate Criteria's to query nested tables?如何使用 Hibernate Criteria 查询嵌套表?
【发布时间】:2012-11-09 22:31:23
【问题描述】:

我查看了所有的 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();

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

感谢您的任何建议。

【问题讨论】:

    标签: java hibernate associations criteria


    【解决方案1】:

    虽然您的查询应该有效,但以下是另一种变体:

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

    【讨论】:

    • 比很多,你的回答为我节省了很多时间!
    • 哪个效率更高? INNER_JOIN 还是添加?
    • 我不认为有一个直接的答案。如果表的数据有限,并且内部连接预先过滤掉不需要的数据,那么它会很有效;否则我们需要处理/微调过滤器条件以在内存中产生最佳的数据需求/操作。我们还可以使用索引、分区和其他查询优化技术来优化数据库配置。
    【解决方案2】:

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

    请随意删除此问题。

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 2023-03-22
      相关资源
      最近更新 更多