JPA クエリ - 特定の結果セットを取得するには?
質問
JPA2/Hibernate/Oracle+Spring+Wicket に基づくアプリでは、次のモデルを使用します。
public class Item {
private String name;
private Set<Application> apps;
private ...
}
public class Application {
private String applicant;
private Item item;
private Status status;
private ...
}
アイテムとアプリケーション間のマッピングでは、すべてのアイテムには多くのアプリケーションがあり、すべてのアプリケーションは 1 つのアイテムのみを指します。
ここで、複雑な基準セットを満たすアプリケーションを検索したいと思います。結果セットが <Item,List<Application>> のペアのセットであれば素晴らしいでしょう (通常は Set<Item> のみであることはできません)。特定の項目に対するアプリケーションのサブセットは基準を満たします)。
これを行う方法をお勧めしていただけますか?私の最初のアイデアは、まず <ItemID, AppID> のペアをクエリし、次にこれらを反復処理して結果セットを手動で生成することでしたが、かなり面倒で非効率的だと思われます。
解決
あなたは、単一のクエリ(そう、あなたが
JOIN
s上の基準を表現するためにApplication
を使用)でそれを表現したい場合は、は、ペアを照会すると、それを行うための唯一の方法である - 。どのようにリレーショナルデータベースの仕事です。
他のヒント
タプルとサブクエリを含む JPA2 基準クエリを使用することをお勧めします。(擬似コード) の行にあるもの:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> crit = cb.createTupleQuery();
Subquery<Application> subquery = cb.subquery(Application.class);
subquery.where(...);
subquery.correlate(...);
crit.select(cb.tuple(cb.from(Item.class), subquery);
現時点ではサブクエリの正確な構文を念頭に置いておらず、それを試すための Eclipse がないため、これは疑似コードです。申し訳ありません。サブクエリの素晴らしい入門書があります。 キース、シンカリオル。プロ JPA 2:Java Persistence API をマスターする.
所属していません StackOverflow