查询限制关联实体

时间:2009-06-19 04:09:30

标签: sql hibernate

我想形成一个关联集合的查询 受限制,理想情况下使用Hibernate Criteria或HQL,但我会 对如何在SQL中执行此操作感兴趣。例如,说我有一个男孩 与Kites类具有双向一对多关联的类。 我想得到一个风筝长度在一定范围内的男孩名单。

问题是我知道的HQL / Criteria只能获得Boy对象 与这两个中给出的完整(不受限制的)风筝组合 示例(HQL是猜测)。即,我找到了有风筝的男孩 在正确的范围内,但对于每个这样的男孩,我得到所有的风筝,而不是 只是范围内的那些。

select new Boy(name) from Boy b 
       inner join Kite on Boy.id=Kite.boyId 
             where b.name = "Huck" and length >= 1;

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

现在我必须得到正确的风筝长度套装的唯一方法是 迭代男孩列表并为每个人重新查询风筝 对于范围内的人。我希望有一些SQL / HQL / Criteria向导 知道更好的方法。我更愿意获得Criteria解决方案,因为我的 真正的“男孩”构造函数有很多参数,它会很方便 拥有初始化的男孩。

我的底层数据库是MySQL。不要以为我知道很多 SQL或Hibernate。谢谢!

2 个答案:

答案 0 :(得分:1)

我不是hibernate专家,但正如你所说,你对SQL解决方案感兴趣......:

在SQL中,我假设你的意思是(添加了索引,键等):

CREATE TABLE Boys (Id INT, Name VARCHAR(16))
CREATE TABLE Kites(Length FLOAT, BoyID INT, Description TEXT)

当然还有其他专栏和c在这里无所谓。

所有男孩都拥有1只风筝,长度在1.0到1.5之间:

SELECT DISTINCT Boys.*
FROM Boys
JOIN Kites ON(Kites.BoyID=Boys.ID AND Kites.Length BETWEEN 1.0 AND 1.5)

如果您还想查看相关风筝的描述,每个男孩N行拥有N个风筝:

SELECT Boys.*, Kites.Length, Kites.Description
FROM Boys
JOIN Kites ON(Kites.BoyID=Boys.ID AND Kites.Length BETWEEN 1.0 AND 1.5)

希望有人可以帮助你将这些与hybernate整合......!

答案 1 :(得分:0)

事实证明,最好通过反转连接来完成:

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

请注意,列表的风筝需要汇总到男孩中 可以使用HashMap轻松完成。