2009-06-19 84 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