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

时间:2017-10-04 12:10:22

标签: java spring jpa spring-data-jpa

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

其中一个实现是通用的,因此需要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);
    }
}

1 个答案:

答案 0 :(得分:3)

您可以使用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);
    }
}

我还没有对这段代码进行过测试,但它应该有效。