2009-06-19 61 views
0

我希望形成一个查询,其中关联的集合受到限制,理想情况下使用Hibernate Criteria或HQL,但我对 感兴趣如何在SQL中执行此操作。例如,假设我有一个男孩 类与Kites类的双向一对多关联。 我想获得一个列表,其中的风筝的长度在一个范围内。限制关联实体的查询

问题是,我知道的HQL /标准只给我一个完整(无限制)的风筝套件,如这两个 示例(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解决方案,因为我的 真正的“Boy”构造函数有很多参数,并且有便利的 来初始化Boys。

我的底层数据库是MySQL。不要以为我对SQL或Hibernate有很多了解。谢谢!

回答

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容易。

1

我不是休眠专家,但你说你感兴趣的SQL解决方案,以及...:

在SQL中,我假定你的意思是这样(加索引,键等):

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

当然其他列&ç那没关系这里的加分。

男孩子都拥有1+风筝lenghts 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 ...结合!

+0

谢谢,这是非常好的,让我思考沿着正确的路线。 – Glenn 2009-07-07 22:37:09