Я работаю с весенней загрузкой и репозиторием 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]
Вы имеете в виду «запрос», который является недопустимым JPQL? Интересно, что значит "не работает"...
Выдает ошибку при запуске проекта




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.
Андроник, спасибо за ваш ответ, но я использую Jparepostory, как я могу использовать здесь createQuery of EntityManager???
@ Алан Хэй, да, но у него уже есть запрос в jpql. @Merwais Muafaq - ответ написан, вы должны @Autowire его ...
Это решило вашу проблему? Если да, то считайте голосование/отметку правильным, если нет - продолжайте обсуждение.
Как уже упоминалось @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.
Надеюсь, это поможет кому-то.
Не работает означает, что он дает неправильный результат или вообще не работает??