@NamedQuery переопределяет findAll в Spring Data Rest JpaRepository

есть ли способ переопределить запрос findAll, выполняемый Spring Data Rest?

мне нужен способ фильтрации результатов на основе некоторых конкретных критериев, и кажется, что с помощью @NamedQuery должно быть в соответствии с тем, что я ищу, поэтому я настраиваю тест.

@Entity
@Table(name = "users")
@NamedQueries({
    @NamedQuery(name = "User.findAll", query="SELECT u FROM User u WHERE u.username = 'test'"), 
    @NamedQuery(name = "User.findNameEqualsTest", query="SELECT u FROM User u WHERE u.username = 'test'")   
})
public class User implements Serializable, Identifiable<Long> { }

С этим на месте я ожидал бы, что SDR использует мой запрос findAll () (возвращает 1 результат), но вместо этого он выполняет ту же самую старую логику findAll (возвращает все результаты).

в моем Репозиторий я добавил:

@Repository
@RestResource(path = "users", rel = "users")
public interface UserJpaRepository extends JpaRepository<User, Long> {

    public Page<User> findNameEqualsTest(Pageable pageable);
}

и в этом случае он забирает предоставленный @NamedQuery. Так...

как я могу переопределить значение по умолчанию findAll() логика? Мне нужно построить сложный набор критериев и применить его к результату.

2 ответов


Да, вы можете создать свою реализацию интерфейса репозитория, есть раздел там в

http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/repositories.html#repositories.custom-implementations

хранилище

   @Repository
    public interface PagLogRepository extends JpaRepository<PagLogEntity, Long>, PagLogCustomRepository {

Пользовательский Интерфейс

public interface PagLogCustomRepository {
PagLogEntity save(SalesForceForm salesForceForm) throws ResourceNotFoundException;

пользовательские реализации

public class PagLogRepositoryImpl implements PagLogCustomRepository {
@Override
    public PagLogEntity save(final SalesForceForm salesForceForm) throws ResourceNotFoundException {

        query = emEntityManager.createNamedQuery("findItemFileByDenormalizedSku", ItemFileEntity.class);
        query.setParameter("skuValue", rawSku);

вместо переопределения сохранить сделать это с findAll, то вы можете создать сложный настройка


в предстоящей версии 1.5 (RC доступен в наших хранилищах milestone) Spring Data JPA вы можете просто переопределить метод в интерфейсе репозитория и аннотировать его с помощью @Query таким образом, запускается выполнение как метод запроса. Это приведет к тому, что именованный запрос будет просмотрен так же, как вы уже привыкли из методов запроса:

interface UserJpaRepository extends PagingAndSortingRepository<User, Long> {

  @Query
  List<User> findAll();

  Page<User> findNameEqualsTest(Pageable pageable);
}

несколько заметок о Вашей декларации репозитория:

  • вам не нужно аннотировать интерфейс с @Repository. Эта аннотация здесь не имеет никакого эффекта.
  • код @RestResource аннотация настраивает экспортера таким образом, что будет по умолчанию в любом случае в Spring Data REST 2.0 (также в RC уже). Гин вперед, предпочитают @RestRepositoryResource, но, как я уже сказал: плюрализация будет по умолчанию в любом случае.
  • мы обычно не рекомендуем расширять определенные интерфейсы магазина, а скорее использовать CrudRepository или PagingAndSortingRepository.