获取通用基础存储库的参数类型名称

时间:2018-12-14 13:22:46

标签: java spring generics spring-data-jpa

我不确定是否可能,但是我的问题是:有没有办法在基本存储库实现中获取通用参数的类名。 这是我的基本界面:

@NoRepositoryBean
public interface AclBaseRepository<T extends BaseEntity> extends QuerydslPredicateExecutor<T>, CrudRepository<T, Long> {
    List<T> findAllWithAcl(Predicate predicate);
    Page<T> findAllWithAcl(Predicate predicate, Pageable pageable);
}

这是我的实现方式

@NoRepositoryBean
public class AclBaseRepositoryImpl<T extends BaseEntity> extends QuerydslJpaRepository<T, Long> implements AclBaseRepository<T> {

    @SuppressWarnings("unchecked")
    public AclBaseRepositoryImpl(JpaEntityInformation<T, Long> entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);
    }

    @Override
    public List<T> findAllWithAcl(Predicate predicate) {
        return findAll(predicate);
    }

    @Override
    public Page<T> findAllWithAcl(Predicate predicate, Pageable pageable) {
        return findAll(predicate, pageable);
    }
}

示例用法:

public interface AccountRepository extends AclBaseRepository<Account> {
}

基本思想是:为所有“实现的”存储库提供一个通用的基本存储库,并带有一些新方法(例如findAllWithAcl)。这些新方法将向定义的查询谓词中注入一个附加谓词(QueryDsl),该谓词基本上根据一些ACL表过滤行。对于该查询,我需要被加载的实体的类名。我可以将类名称作为参数传递给构造函数,但是我将这个基础存储库用作新的repositoryBaseClass(例如@EnableJpaRepositories(repositoryBaseClass = AclBaseRepositoryImpl.class)),并且我的存储库是接口,所以我无法控制这些参数。 这可能吗?是否有另一种/更好的方法来执行此操作,而无需多次重复相同的代码?

1 个答案:

答案 0 :(得分:2)

您可以从构造函数中提供的JpaEntityInformation实例中获取信息。 由于它实现了JpaEntityMetadataEntityMetadata,因此您可以通过getEntityName()访问实体名称,并可以通过getJavaType()访问域类。

此外,由于AclBaseRepositoryImpl继承自QuerydslJpaRepositorySimpleJpaRepository,因此您可以简单地调用getDomainClass