这里的用例是找一些有限的男孩 风筝长度在一定范围内,然后可选择取回 这个范围内的所有风筝都属于那些男孩。
不要以为我对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>=?
答案 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。