2014-02-12 4 views
6

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

Мне нужен способ фильтрации результатов на основе некоторых конкретных критериев, и кажется, что использование @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 я добавил:

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

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

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

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

ответ

3

Да, вы можете создать реализации Вашего Repository интерфейса, есть acouple раздел в

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

Repository

@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, то вы можете создавать сложные настройки

+0

Выполнено и работает. Несколько раз бил головой о клавиатуру, пока я не осознал важность имен классов в этом процессе. –

+0

Действительно, это очень распространенная проблема, заданная несколько раз в SOverflow, в учебнике должно быть указано примечание – Koitoer

+1

По состоянию на Spring Data JPA 1.5 для выполнения этой задачи больше не потребуется настраиваемая реализация. См. [Мой ответ] (http://stackoverflow.com/a/21751130/18122) для получения дополнительной информации. –

10

В следующей версии 1.5 (RC-доступно в наших поэтапные хранилищах) Весна данных 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 уже). Ging вперед, предпочитайте @RestRepositoryResource, но, как я сказал: плюрализация будет по умолчанию в любом случае.
  • Обычно мы не рекомендуем распространять определенные интерфейсы магазина, но используйте CrudRepository или PagingAndSortingRepository.
+1

Большое спасибо, Оливер! Вчера я смотрел ваш репозиторий Deepdive, и это действительно помогло мне разобраться. Сегодня я сделаю некоторые изменения, чтобы лучше реализовать свои лучшие практики. –

 Смежные вопросы

  • Нет связанных вопросов^_^