外国の個別の選択次のエンティティの構造である:私は、このデータベースを照会する必要がクライテリアAPI JPA Hibernateは:指定されたキー
| id | stringValue | item_id |
次のように
@Entity
public class Item {
@Id @GeneratedValue
private Long id;
@OneToMany
private Set<ItemEntry> itemEntries;
public Item() {
itemEntries = new HashSet<>();
}
// Getters and setters
}
@Entity
public class ItemEntry {
@Id @GeneratedValue
private Long id;
private String stringValue;
@ManyToOne
private Item item;
public Item() {}
// Getters and setters
}
これは、データベーステーブルItemEntryに解決JPA環境(永続性プロバイダはHibernate)内のCriteria APIと正規のメタモデルを使用しています。
クエリはstringValue
は%のように私%であるすべての明確なItem
オブジェクトを取得することです。 %my%と一致するstringValue
は、Item
に複数回割り当てられる場合があります。
私がこれまで持っていることは、次のコードです:
final CriteriaQuery<ItemEntry> itemEntryQuery = criteriaBuilder.createQuery(ItemEntry.class);
final Root<ItemEntry> itemEntryRoot = criteriaQuery.from(ItemEntry.class);
final Path<Item> selection = itemEntryRoot.get(ItemEntry_.item);
itemEntryQuery.select(selection).where(...).distinct(true);
は、コンパイラが示すエラーを発行
The method select(Selection<? extends ItemEntry>) in the type CriteriaQuery<ItemEntry> is not applicable for the arguments (Path<Item>)
私が探しています何を達成するための別の可能性がありますために?この時点でSetJoin<Item, ItemEntry>
を使用することはできません。stringValue
で結果を注文する必要があります。これは、個別のクエリの選択リストに項目別の注文を表示する必要があるため不可能です。 SetJoin<Item, ItemEntry>
を使用する場合は、Item
のフィールドのみがselect句に表示されます。
あなたの答えをありがとう。 where条件は動的に構築されるため、Criteria APIを使用するのが正当なようです。基本的に、私は 'Item'オブジェクトを扱う必要があることに同意します。私がそれを「他の方法で」動かすために必要な主な理由は、私の質問に述べられています。「この時点で、SetJoin- を使用することはできません。個別のクエリの選択リストに項目別の順序を表示する必要があるため、不可能です。 –
fatdevelops
それで、私は、 'ItemEntry'クラスの' item_id'で明確なクエリを実行し、別のクエリで 'Item'オブジェクトをフェッチすることをお勧めします。 – fatdevelops
それは私には分かりません。アイテムに存在しないフィールドでアイテムをどのように注文できますか?しかし、とにかく、それはあなたの問題とはあまり関係がありません。 Itemを返すクエリが必要な場合は、CriteriaQueryではなく、CriteriaQuery - が必要です。 –