Получение только первого/последнего элемента с использованием Spring данных JPA и аннотации @Query
EDIT: Решения этой проблемы приведены во втором и четвертом ответах по этому вопросу setMaxResults для аннотации Spring -Data-JPA?
Цель: Получить наибольший/наименьший элемент по свойству z с помощью репозитория данных JPA и Spring Query annotation.
Что я до сих пор
@Query("SELECT xelement FROM x xelement ORDER BY xelement.z")
public List<X> findFirstElement();
Проблема: Этот запрос извлекает все элементы (что не очень эффективно). Если я буду использовать EntityManager напрямую, я могу установить количество результатов, используя
entityManager.setMaxResults(1)
чтобы получить только первый элемент.
Вопрос: Как указать максимальное количество результатов с помощью аннотации @Query?
Идея: Использует значение PageRequest размера 0?
Ограничения: Я знаю функцию запроса FindFirstBy...., но я хочу/должен использовать аннотацию @Query
.
Ответы
Ответ 1
Вы можете использовать свойство limit в sql, просто добавив nativeQuery в аннотацию @Query. Тем не менее, есть другой и лучший способ сделать это. Pageable класс в вашем методе репозитория решит вашу проблему, не касаясь аннотации @Query:
@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z")
List<X> findFirstElement(Pageable limit);
Чтобы установить предел и смещение, команда use должна вызвать этот метод хранилища следующим образом:
List<X> xValues = xRepository.findFirstElement(new PageRequest(0, 1));
Здесь 1 соответствует желаемому пределу.
ОБНОВЛЕНИЕ (SPRING DATA 2.0)
Используйте PageRequest.of(0, 1) вместо нового PageRequest (0, 1)
Ответ 2
Попробуйте сделать это:
@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z LIMIT 1",
nativeQuery = true)
Ответ 3
Ближайший синтаксис запроса JPA, который я могу представить для вашего примера использования, findFirstByZIsNotNullOrderByZAsc
. Это должно исключить необходимость написания пользовательского собственного запроса.