Получение только первого/последнего элемента с использованием 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. Это должно исключить необходимость написания пользовательского собственного запроса.