2012-02-29 6 views
0

これはquestion I asked earlierに似ています。その質問への答えは私の問題を部分的に解決しましたが、私はそこで指定した種類の検索を実行しようとする際にまだいくつか問題があります。さらに、私は単純にHibernateがさまざまなシナリオで何を返すかを理解するのに苦労しています。コレクションオブジェクトに対するHQLクエリの理解

は、ここに私のマッピングです:名前で

Client { 
    @OneToMany(mappedBy="client",cascade=CascadeType.ALL) 
    private Set<Group> groups = new HashSet<Group>(); 
} 

Group { 
    @ManyToOne (cascade=CascadeType.ALL) 
    private Client client = new Client(); 

    private String name; 
    private String state; //two char state code 
    private String extId; //unique identifier; candidate key, but not the @Id. 
} 

問合せは、(パラメータの両端にワイルドカードを持つように例えば、)インラインです。状態とextIdは等価です。

次のクエリが結合のみ一致するグループと、単一のクライアントを返し、他のグループがクライアントに関連付けられている場合であっても(extIdのみのグループを返すことを再度注意してください):

select distinct client from Client as client 
inner join client.groups as grp 
where grp.extId = :extId 

このクエリは、単一のクライアントを返しますが、関係なく、グループの状態コードが基準に一致するかどうかの、添付を持つすべての関連するグループ:

select distinct client from Client as client 
inner join client.groups as grp 
where grp.state= :state 

最後に、このクエリは一致する各グループのクライアントの別のコピーを返し、各コピーに関係なく、グループの名前が基準に一致するかどうかの、その関連グループのすべてが含まれています

select distinct client from Client as client 
inner join client.groups as grp 
where grp.name like :name 

私はHibernateを初めて使っています。そして、私は、何がクエリから返されるのか予測できないという非常に不満を感じています。 WHERE句の小さな変更を除いて、3つのクエリはすべてほぼ同じですが、それぞれについて根本的に異なる結果が得られます。私はドキュメンテーションを見直す時間を費やしましたが、この動作が説明されているところではどこにもいなくなりました。誰もがこれについていくつかの光を当てることができますか?

は最後に、私が実際に行う必要があることはGroupで問い合わせるときClient sを返します、そしてクライアントのみは、検索条件に一致するGroup Sを含めることです。これを行うためのHQLクエリを構築するためのシングルショットの方法はありますか、複数のクエリを実行してオブジェクトをコードで構築する必要がありますか?

ありがとうございました。

+1

これは私が観察していることとはまったく異なります。グループのコレクションが遅延ロードされていますか?すべてのクエリには別個のものがあり、フェッチ句はありませんか?この3つのクエリは、alazy-loadedコレクションを使用して、テストではまったく同じ動作を期待しています。 –

+0

まあ、それは熱心な読み込みのための注釈ではない、私はフェッチ結合をしていないので、なぜ、それが熱心に読み込まれるのか分からない。私はEclipseのビルドをきれいにしようとしています。それがあれば、私は悲鳴を上げると、必ずしもその順番ではなく、firebombing行くつもりです。 FWIW、あなたはどんなふりをしていますか?あなたは彼らが皆あなたのために同じだと言ったが、それは何ですか? – Ickster

+0

各クエリーには異なるエンティティがロードされ、ロード時にコレクションのすべての要素が存在します。 –

答えて

1

これに対する答えは2倍です。 1つは、データベースにアーティファクトを残さずにテストインスタンスを作成するためにトランザクションロールバックを使用していたテストハーネスに問題がありました。これは質問の中で私の奇妙な反応の原因でした。

私は、単にコレクションを外側のフェッチ結合に変更するだけで、必要な値を返すことができました。