具有受限关联的Hibernate Criteria查询

这里的用例是找到一些受限制的具有一定范围长度的风筝的男孩,然后可以检索属于这些男孩的范围内的所有风筝。

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

我想形成一个Hibernate Criteria查询,其中关联的集合已被限制。 例如,假设我有一个Boy类,它具有与Kites类的双向一对多关联。 我想得到一份风筝长度在一定范围内的男孩名单。

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

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>=?

尝试改变

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”)。


感谢您的答案。 这实际上是一个两部分问题:为什么我的Criteria查询没有工作,以及如何获取受限关联的集合。 第一部分是通过修复我指出的连接错误和FoxyBOA鼓励我找到的。

第二个更有趣的问题,我在这里再次提出。

链接地址: http://www.djcxy.com/p/36973.html

上一篇: Hibernate Criteria query with restricted associations

下一篇: Criteria vs. JPQL or HQL