2009-06-19 9 views
0

関連付けられたコレクションが に制限されている、理想的にはHibernate CriteriaまたはHQLであるクエリを作成したいと思いますが、これはSQLでこれを行う方法に興味があります です。たとえば、Kitesクラスへの双方向の1対多の関連付けを持つBoy クラスがあるとします。 私は、凧の長さが範囲内にある男の子のリストを取得したいと思います。関連するエンティティを制限するクエリ

問題は、私が知っているHQL /基準が唯一の少年は凧の完全な(無制限)に設定して オブジェクトこれら2つの の例で与えられるよう、(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(); 

私は正しいカイト長セットを取得する必要があります唯一の方法は、少年のリストを通って、範囲内のもののためにそれぞれ1再クエリ凧 のために反復する です。私はいくつかのSQL/HQL/Criteriaウィザード がより良い方法を知っていることを望んでいます。 実際の "ボーイ"コンストラクタにはかなりの引数があり、初期化されたボーイズを持たせると便利です のため、Criteriaソリューションを取得することをお勧めします。

私の基になるデータベースは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

は、私はHibernateの専門家だが、あなたが言うように、あなたは同様にSQLソリューションに興味を持っている:

SQLで

が、私はあなたが(インデックス、キーを追加したようなものを意味すると仮定します、など):ここでは関係ありません。もちろん、他の列& Cの

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

プラス。

1.0と1.5の間lenghtsで1+凧を所有しているすべての男の子:

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

関連する問題