具有受限关联的Hibernate Criteria查询

时间:2009-06-16 19:03:16

标签: hibernate join

这里的用例是找一些有限的男孩 风筝长度在一定范围内,然后可选择取回 这个范围内的所有风筝都属于那些男孩。

不要以为我对SQL或Hibernate了解多少。

我想形成一个关联的Hibernate Criteria查询 收集受到限制。例如,假设我有一个男生班 与Kites类的双向一对多关联。 我想得到一个风筝长度在一定范围内的男孩名单。

我可以通过HQL查询获得满足此目标的字段(但不是Boys):

select Boy.name from Boy 
       inner join Kite on Boy.id=Kite.boyId 
             where length >= 1;

然而,使用Criteria的这种尝试总是返回list.size()为零 (尽管Boy Huck有一系列长度为0.1-2.0的风筝):

Criteria crit = session.createCriteria(Boy.class);
crit.add(Restrictions.eq("name", "Huck"))
    .createCriteria("kites")
    .add(Restrictions.ge("length", new BigDecimal(1.0)));
List list = crit.list();

理想地和另外地,对于这个列表中的每个男孩(假设我的 代码工作!)我想在boy.getKites()中的所有风筝 满足长度限制。第二个目标可能是如意 思。

我对Criteria尝试的问题的猜测是加入 是不对的:我看到了ff。,但不知道如何解决它。

Hibernate: 
    select
        this_.id as id3_1_,
        this_.name as name3_1_,
        ...
        kites1_.id as id4_0_,
        kites1_.boyId as boyid2_4_0_,
        kites1_.length as length3_4_0_,
        ...
    from
        Boy this_ 
    inner join
        Kite kites1_ 
            on this_.id=kites1_.id         <--- Should be =boyid?
    where
        this_.name=? 
        and kites1_.length>=?

2 个答案:

答案 0 :(得分:4)

尝试更改为

Criteria crit = session.createCriteria(Boy.class);
crit.add(Restrictions.eq("name", "Huck"))
    .createAlias("kites", "k")
    .add(Restrictions.ge("k.length", new BigDecimal(1.0)));
List list = crit.list();

或在HQL中明确写入:

Query query = HibernateUtil.getSession().createQuery("SELECT b FROM Boy b INNER JOIN b.kites k WHERE b.name=:name AND k.length>=:length");
query.setString("name", "Huck");
query.setBigDecimal("length", BigDecimal.ONE);

如果它不起作用,你在Boys-Kites映射中有一个问题(hibernate beleive,两个表中的连接列都是“id”)。

答案 1 :(得分:0)

感谢您的回答。这实际上是一个两部分问题:为什么我的Criteria查询不起作用,以及如何获得受限制的关联集。第一部分通过修复我指出的连接错误来解决,FoxyBOA鼓励我找到。

我重新问过的第二个更有趣的问题here