2017-04-26 7 views
1

私はJPA 2.1プロジェクトを持っています。データベースには2つのテーブルがあります。私はインターフェイス「UsedClasses.java」を作成し、両方のエンティティがインタフェースを実装していている。すなわち、JPAエンティティのインタフェースから@NamedQueryを取得する

@Entity 
@Table(name = "runRanges") 
@NamedQuery(name = "RunRange.findAll", query = "SELECT r FROM RunRange r") 
public class RunRange extends AbstractTimestampEntity implements UsedClasses, Serializable .... 

@Entity 
@Table(name = "users") 
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u") 
public class User extends AbstractTimestampEntity implements UsedClasses, Serializable ... 

私はNamedQueryをつかむためにインタフェースを使用することができるかどうかを知るために好奇心いずれかのエンティティについて。 クラスに応じて結果リストを取得しようとしたら、何を達成しようとしていますか?

あなたがそれを行うことができますが、あなたは NamedQuery注釈を取得するためにリフレクションを使用する必要がありますし、あなたが UsedClassesインスタンスではなく、あなたの例のようなインターフェイスを持っている必要があります
public List<UsedClasses> getAllItems() { 
    open(); 
    Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(UsedClasses.class.getResource(NamedQueries)); 

    List<UsedClasses> aList = query.getResultList(); 
    return aList; 
} 

答えて

1

Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(UsedClasses.class.getResource(NamedQueries)); 

以外にも、あなたの場合複数の注釈を追加すると、それ以上は機能しません。

私はよりシンプルでクリーンなソリューションがnamedQuery文字列名を得るためにあなたのインターフェースにメソッドを追加するだろうと思います。例

public interface UsedClasses(){ 
    String getNamedQueryForGetAll();  
} 

については
そして、あなたはこの方法でそれを実現することができます。

@Entity 
@Table(name = "users") 
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u") 
public class User implements UsedClasses(){ 
    public String getNamedQueryForGetAll(){    
     return "User.findAll"; 
    } 
} 

その後、あなたはこの方法でそれを使用することができます。

Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(usedClassInstance.getNamedQueryForGetAll()); 

、私はそれことを見つけます重複を少し作成し、それはまっすぐに読めるわけではありません。
NamedQueryは非常に小さなパフォーマンス向上をもたらします。
私は、実行時間の面で非常に少ない得るためのコードで導入された複雑/間接のレベルは、あなたが勝つ作ることを確認していません。

+0

最初の提案に: クエリクエリ= EntityManagerHandler.INSTANCE.getEntityManager()。createQuery(UsedClasses.class.getResource(NamedQueries)); これは機能しません。エラーメッセージは、 NamedQueriesを変数に解決できません。 2番目の提案に : 私はクラスのインクルードは、クエリを作成するには、私はUsedClassesをインスタンス化していないので、それを使用する方法を理解していません。 getNamedQueryForGetAll()メソッドを呼び出すにはどうすればよいですか? – mkunkel

+0

あなたが私が編集していた時、あなたはその質問に答えました。ごめんなさい。しかし、今はインスタンスがどのクラスをどのようにインターフェースしているかを知ることができません。 – mkunkel

関連する問題