我不确定是否可能,但是我的问题是:有没有办法在基本存储库实现中获取通用参数的类名。 这是我的基本界面:
@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)
),并且我的存储库是接口,所以我无法控制这些参数。
这可能吗?是否有另一种/更好的方法来执行此操作,而无需多次重复相同的代码?
答案 0 :(得分:2)
您可以从构造函数中提供的JpaEntityInformation
实例中获取信息。
由于它实现了JpaEntityMetadata
和EntityMetadata
,因此您可以通过getEntityName()
访问实体名称,并可以通过getJavaType()
访问域类。
此外,由于AclBaseRepositoryImpl
继承自QuerydslJpaRepository
的SimpleJpaRepository
,因此您可以简单地调用getDomainClass
。