Получить имя типа параметра общего базового репозитория - PullRequest
0 голосов
/ 14 декабря 2018

Я не уверен, если это вообще возможно, но мой вопрос: есть ли способ получить имя класса универсального параметра внутри базовой реализации репозитория.Это мой базовый интерфейс:

@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 голосов
/ 14 декабря 2018

Вы можете получить информацию из экземпляра JpaEntityInformation, предоставленного в конструкторе.Поскольку он реализует JpaEntityMetadata и EntityMetadata, у вас есть доступ к имени объекта через getEntityName() и к классу домена через getJavaType().

Также, поскольку AclBaseRepositoryImpl наследуется от QuerydslJpaRepository, который наследуется от SimpleJpaRepository, вы можете просто позвонить getDomainClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...