繁体   English   中英

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

[英]Access JpaEntityInformation in custom repository implementation

我有一些Spring Data存储库,通过这里描述的片段进行扩展。 只要我在这个实现中只注入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);
    }
}

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

我没有测试过这段代码,但它应该可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM