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);
}
}