Hibernate: как получить последние n строк в весенней загрузке JpaRepository?

Я работаю с весенней загрузкой и репозиторием jpa. Я хочу получить последние 2 записи из базы данных, используя запрос hql. Я написал следующий запрос, но он не работает.

@Query("select news from(select news from NewsDTO news order by news.newsId desc limit 2) sub order by news.newsId asc")

Он выдает следующее исключение

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 17 [select news from(select news from com.mer.aigs.dto.news.NewsDTO news order by news.newsId desc limit 2) sub order by news.newsId asc]

Не работает означает, что он дает неправильный результат или вообще не работает??

vinay chhabra 09.02.2019 08:08

Вы имеете в виду «запрос», который является недопустимым JPQL? Интересно, что значит "не работает"...

user3973283 09.02.2019 08:29

Выдает ошибку при запуске проекта

Merwais Muafaq 09.02.2019 08:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
1 505
4

Ответы 4

JPQL изначально не поддерживает предложение LIMIT. Однако с Spring Data JPA вы можете использовать сочетание ORDER BY .. DESC и Pageable для достижения того, что вы намереваетесь. Обратитесь к этому для получения подробной информации https://www.logicbig.com/tutorials/spring-framework/spring-data/pagination.html

Ключевое слово limit не поддерживается hql (даже по-разному в разных базах данных). Вам необходимо создать Query с помощью диспетчера сущностей и указать максимальный размер:

em.createQuery("your query").setMaxResults(2).getResultList()

предполагая, что у вас есть менеджер сущностей:

@Autowired
private EntityManager em

Это решение работает лучше, чем использование Pageable.

Извините, но он использует Spring Data, поэтому ему не нужно напрямую использовать Entity manager.

Alan Hay 09.02.2019 10:36

Андроник, спасибо за ваш ответ, но я использую Jparepostory, как я могу использовать здесь createQuery of EntityManager???

Merwais Muafaq 10.02.2019 12:27

@ Алан Хэй, да, но у него уже есть запрос в jpql. @Merwais Muafaq - ответ написан, вы должны @Autowire его ...

Andronicus 10.02.2019 13:26

Это решило вашу проблему? Если да, то считайте голосование/отметку правильным, если нет - продолжайте обсуждение.

Andronicus 13.02.2019 17:01

Как уже упоминалось @Kedar, вы не можете использовать LIMIT внутри своего запроса JPQL из-за особенностей базы данных. Поэтому вам нужно использовать NATIVE QUERY и заменить имя физической таблицы и имя столбца для NewsDTO и newsId:

@Query(value = "select news from(select news from *NewsDTO* news order by *newsId* desc limit 2) sub order by *newsId* asc", nativeQuery = true)

Это сработало для меня, где created — это столбец метки времени в таблице:

repository.findAll(PageRequest.of(0, 2, Sort.by("created").descending())))

В моем случае я хотел, чтобы результат был отсортирован по столбцу created.

Надеюсь, это поможет кому-то.

Другие вопросы по теме