の有効な動作です:が、それは私は2つのエンティティが以下のようにマッピングされ、AとBを言わせて持って休止状態(JPQLクエリ、OneToMany)
public class A{
...
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL)
Set<B> bs
}
public class B{
...
String someProp;
...
@ManyToOne
@JoinColumn(name = "A_ID")
A a
}
Aのいくつかのエンティティインスタンスは、データベース内のBの2つの要素を持っています。
私は等の単純なクエリを実行する場合:
entityManager.createQuery("SELECT a FROM A a WHERE a.id = 1").getSingleResult();
をし、すべてが期待どおりに動作しますが、私はセットでのBの2つのインスタンスとインスタンスを得たが、私は、クエリを実行したとき:
Query query = entityManager.createQuery("SELECT a FROM A a JOIN FETCH a.bs b WHERE b.someProp= :somePropParam");
query.setParameter("somePropParam","somePropValue");
query.getResultList();
私はセットの中のBの1つの要素(私が求める要素)を持つAのインスタンスを得ました。
私は、クエリを変更:
entityManager.createQuery("SELECT b.a FROM B b JOIN b.a a WHERE b.someProp = :somePropParam.. more a conditions);
//.... this query works.
は、最初のクエリ負荷Bのすべてのインスタンスをべきではないのですか? Hibernateはそれらをすべてロードするために追加のクエリを実行するべきではありませんか?
にBsの完全なコレクションを構築します返されたオブジェクトは、常に2つの要素を見つける必要があります。 –
私はそれがAの "bs"セットの2要素を返すべきだと思うが、Aからの選択された '/ **カラムとb **/ から返されたように、ただ1つを返す。 .id = b.a_id b.someProp = 'someProperty''条件を満たしていない、追加のBテーブル行をロードする追加のクエリはありません。 'b.someProp =' someProperty'' –
"期待される動作 "休止状態では確かに他の実装ではありません... –