在自定义存储库实现中访问 JpaEntityInformation

Flo*_*mer 6 java spring jpa spring-data-jpa

我有一些Spring Data通过片段扩展的存储库,如here所述。只要我只EntityManager在这个实现中注入 ,这就可以正常工作。

其中一个实现是通用的,因此JpaEntityInformation当前实体需要一个实例才能正常工作(我基本上只需要实体名称和 java 类型)。如果我也尝试在构造函数中“自动装配” this,我会收到一个异常,指出找不到类的 bean JpaEntityInformation

我理解这个异常,但我想知道是否有另一种方法来获取为当前存储库实例创建的实体的名称和类。我认为应该可以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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mus*_*afa 5

您可以使用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, manager);
        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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我还没有测试过这段代码,但它应该可以工作。