2017-02-23 8 views
1

私のアプリケーションには、IDと名前の列を持つ250以上のテーブルがあります。私は、アプリケーションをhibernate 3からSpring-JPA 4.3に移行しようとしています。複数のエンティティファインダを持つ一般的なspring jpaリポジトリ

public class DAO 
{ 
    private Session session; 

    public DAO(Session session) 
    { 
     this.session=session; 
    } 

    public EntityA findById(String id) 
    { 
     //implementation 
     return entityA; 
    } 
    public EntityB findByName(String name) 
    { 
     //implementation 
     return entityB; 
    } 
    public EntityC findByIdAndName(String id, String name) 
    { 
     //implementation 
     return entityC; 
    } 
} 
私はより一般的な方法で、以下の行っている可能性日間で戻る

が、私は私が持っている場合は、このクラスを再初期化したくなかった。私の現在の休止層で

私は(オプション1)を持っていますIDでフェッチする10の異なるエンティティ。

public class DAO<T> 
{ 
    public T findById(String id) 
    { 
     //implementation 
     return T; 
    } 
    public T findByName(String name) 
    { 
     //implementation 
     return T; 
    } 
    public T findByIdAndName(String id, String name) 
    { 
     //implementation 
     return T; 
    } 
} 

これをSpring-JPAでどのように実現できますか。だから私はIDで10の異なるエンティティを取得する必要がある場合、私は10のリポジトリを初期化したくない、私はbyIdまたはbyNameまたはbyIDAndNameが必要な任意のエンティティをフェッチするために使用できる1つのリポジトリを持っている。私はJdbcTemplateで簡単にそれを行うことができますが、それはJPA/hibernateのキャッシュメカニズムでは追跡できないことを意味します。あなたは、共通の属性を持つスーパークラス(複数可)を作成@MappedSuperclassとしてマークしてリポジトリを作成することができるはず

{ 
    @Query("from EntityA where id=?1") 
    EntityA findEntityAById(String id); 

    @Query("from EntityB where name=?1") 
    EntityB findEntityBById(String name); 

    @Query("from EntityC where id=?1 and name=?2") 
    EntityC findEntityCById(String id,String name); 
} 
+0

Spring JPAの代わりにSpring Data JPAを使用していますか?あなたはできません...自分の実装を書いてください... –

答えて

1

:どのように1つのJPAリポジトリに次の操作を行うことができますので

そのスーパークラスのための@NoRepositoryBeanあなたはあなたの結果のためにいくつかのキャストをしなければなりません。 this answer

関連する問題