2011-09-14 12 views
0

私はクエリを書く必要があります。ここに簡略化された問題があります。 名前付きバスケットがあります。それらに果物がある(0以上)。バスケットにはオーナーがいます(1つ以上)。フルーツにはオーナーもいます(1人以上)。私は、ジョーのバスケットの中にジョーの果物のリストを取得したい。ジョーのバスケットにはジョーの果物がない。ここで我々は行く:HQL - 2条件での外部結合

select basket.name, fruit.name from Owner owner 
join owner.baskets basket 
left outer join basket.fruits fruit WITH OWNER in (FRUIT.OWNERS) 
where owner.id = joe_id 

しかし...それはHQLでは動作しません。それは素敵にしか見えません。 SQLでは単純です。

だから、質問は次のとおりです。 はどのように私はHQLまたは基準API(Hibernateは3.3を使用して) にもっとして1つの条件で参加できます。

私は空のバスケットを後で取り出すことができないので、どのアイテムがどのページにあるべきかを計算することができないため、ページングが必要です。私の現在の解決策はネイティブクエリですが、方法が必要です。

+0

休止状態からの実際のエラーメッセージがここで最も参考になる... – digitaljoel

+0

私はどこにも例のスタックトレースを見つけることができませんが、それはWITH句クエリASTの二つの異なる枝の条件を兼ね備えているため、このクエリが正しくないことを言いました木、または何かこの行に沿って。とにかく、WITH句は両方の条件が同じオブジェクトに関連する場合に機能します: 'kitten * as kitten * with kitten * .bodyWeight> 10.0'(hibernateドキュメントの例)。実際には、WITHを使用する必要があるときはいつでも動作しませんでした;) – mabn

答えて

-1

基準APIとエイリアスまたはサブ基準で問題を解決できると思います。

Hibernate基準は、果物の場合は左外部結合を、バスケットの場合は内側の外部エイリアスを作成します。

Criteria criteria = getSession().createCriteria(Account.class).setProjection(
      Projections.projectionList() 
        .add(Property.forName("fruit.name")) 
        .add(Property.forName("basket.name")) 
    ); 
    criteria.createAlias("fruits", "fruit",1); 
    criteria.createAlias("baskets","basket",0); 
    criteria.add(Property.forName("fruit.owner").eqProperty("basket.owner")); 
    List<Object> l = criteria.add(Restrictions.eq("id", some_joe_id_var).list(); 
+0

これは 'SELECT .. JOIN ... LEFT OUTER JOIN basket.fruits fruit WHERE fruit.owner = basket.owner'と同じです。 。どうして?これはすべてのJoeのバスケットにすべての果物を添えているので、Joeに属していない果物で結果を除外します。これはジョーの緑のバスケットをアンのリンゴでろ過し、この緑色のバスケットを代わりに結果に表示する必要があります(緑色のバスケットとNULLフルーツの1列) – mabn

関連する問題