2017-10-04 3 views
0

hereのようにフラグメントを介して拡張されたSpring Dataリポジトリがあります。この実装ではEntityManagerしか注入しない限り、これは問題なく動作します。カスタムリポジトリの実装でJpaEntityInformationにアクセス

これらの実装の1つは汎用的なものであり、現在のエンティティが正しく動作するためにはJpaEntityInformationのインスタンスが必要です(基本的にエンティティ名とJavaタイプのみが必要です)。これをコンストラクタで「自動配線」しようとすると、クラスJpaEntityInformationのBeanは見つかりませんでした。

私はこの例外を理解していますが、現在のリポジトリインスタンスが作成されたエンティティの名前とクラスを取得する別の方法があるかどうかを知りたいと思います。私は、何らかの理由でコンストラクタを介してJpaEntityInformationを取得することが可能であるべきだと思った。これは、カスタムリポジトリベースクラス(これを実行したくない)を指定した場合に行われる方法であるためです。

以下に、私が説明した内容のユースケースを見つけることができます。

@NoRepositoryBean 
@RequiredArgsConstructor 
public class FindByFieldRepositoryImpl<T> implements FindByFieldRepository<T> { 

    private final JpaEntityInformation<T, ?> entityInformation; 
    private final EntityManager manager; 

    @Override 
    public T findByField(String field, Object value) { 
     return createQuery(field, value).getSingleResult(); 
    } 

    private TypedQuery<T> createQuery(String fieldName, Object fieldValue) { 
     String entityName = entityInformation.getEntityName(); 
     Class<T> entityType = entityInformation.getJavaType(); 

     String queryString = String.format("FROM %s WHERE %s = :value", entityName, fieldName); 
     TypedQuery<T> query = manager.createQuery(queryString, entityType); 
     return query.setParameter("value", fieldValue); 
    } 
} 

答えて

0

JpaEntityInformationSupportを使用して、そのクラスのエンティティ情報を取得できます。あなたのコードは次のようになります:

@NoRepositoryBean 
@RequiredArgsConstructor 
public class FindByFieldRepositoryImpl<T> implements FindByFieldRepository<T> { 

    private final EntityManager manager; 

    @Override 
    public T findByField(String field, Object value, Class<T> clazz) { 
     return createQuery(field, value, clazz).getSingleResult(); 
    } 

    private TypedQuery<T> createQuery(String fieldName, Object fieldValue, Class<T> clazz) { 
     JpaEntityInformation entityInformation = JpaEntityInformationSupport.getEntityInformation(clazz, entityManager); 
     String entityName = entityInformation.getEntityName(); 
     Class<T> entityType = entityInformation.getJavaType(); 

     String queryString = String.format("FROM %s WHERE %s = :value", entityName, fieldName); 
     TypedQuery<T> query = manager.createQuery(queryString, entityType); 
     return query.setParameter("value", fieldValue); 
    } 
} 

このコードはテストされていませんが、動作するはずです。

関連する問題