2016-07-08 3 views
0

外国の個別の選択次のエンティティの構造である:私は、このデータベースを照会する必要がクライテリア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句に表示されます。

答えて

1

CriteriaQuery<T>では、Tがクエリの結果のタイプです。 ItemEntriesではなくItemを返すようにクエリを設定します。したがって、CriteriaQuery<Item>にする必要があります。

いくつかの基準に基づかず、dynamicallを構築する必要がないクエリに対しては、基準クエリを避けることに注意してください。単純なJPQLははるかに簡単で読みやすいです:

select distinct item from ItemEntry entry 
join entry.item item 
where entry.stringValue like :param 
+0

あなたの答えをありがとう。 where条件は動的に構築されるため、Criteria APIを使用するのが正当なようです。基本的に、私は 'Item'オブジェクトを扱う必要があることに同意します。私がそれを「他の方法で」動かすために必要な主な理由は、私の質問に述べられています。「この時点で、SetJoin を使用することはできません。個別のクエリの選択リストに項目別の順序を表示する必要があるため、不可能です。 – fatdevelops

+0

それで、私は、 'ItemEntry'クラスの' item_id'で明確なクエリを実行し、別のクエリで 'Item'オブジェクトをフェッチすることをお勧めします。 – fatdevelops

+0

それは私には分かりません。アイテムに存在しないフィールドでアイテムをどのように注文できますか?しかし、とにかく、それはあなたの問題とはあまり関係がありません。 Itemを返すクエリが必要な場合は、CriteriaQuery ではなく、CriteriaQuery が必要です。 –

関連する問題