@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 ответов
Да, вы можете создать свою реализацию интерфейса репозитория, есть раздел там в
хранилище
@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
.