Я не уверен, если это вообще возможно, но мой вопрос: есть ли способ получить имя класса универсального параметра внутри базовой реализации репозитория.Это мой базовый интерфейс:
@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)
), а мои репозитории являются интерфейсами, я не имею никакого контроля над параметрами.Это возможно?Есть ли другой / лучший способ сделать это без необходимости повторять один и тот же код несколько раз?