Указание предложения LIMIT в операторе @Query репозитория JPA2
-
21-12-2019 - |
Вопрос
У меня есть следующий оператор MySQL:
"SELECT * FROM $this->tableName WHERE news_publication_id = '" + newsPublicationId + "' AND list_order > '" + listOrder +"' ORDER BY list_order LIMIT 1"
Я начал путь обработки данных с создания слоя Hibernate DAO.
Он имел следующий метод, основанный на критериях:
@Override
public NewsHeading findNextWithListOrder(NewsPublication newsPublication, int listOrder) {
Criteria criteria = getSession().createCriteria(getPersistentClass());
criteria.add(Restrictions.eq("newsPublication", newsPublication));
criteria.add(Restrictions.gt("listOrder", listOrder)).addOrder(Order.asc("listOrder")).setMaxResults(1);
return (NewsHeading) criteria.uniqueResult();
}
И это работает просто отлично.
Затем я попытался создать уровень репозитория JPA2.
Теперь у него есть следующий метод на основе JPQL:
@Query("SELECT nh FROM NewsHeading nh WHERE nh.newsPublication = :newsPublication AND nh.listOrder > :listOrder ORDER BY nh.listOrder ASC LIMIT 1")
public NewsHeading findByNextListOrder(@Param("newsPublication") NewsPublication newsPublication, @Param("listOrder") int listOrder);
Но это не работает.Потому что предложение LIMIT недействительно.
Поэтому мне интересно, что делать.
Могу ли я по-прежнему использовать метод, основанный на критериях, описанный выше, на этом уровне репозитория JPA2?
Я хотел бы не доверять клиенту передачу предельного значения и предпочитаю жестко закодировать это значение (1) в моем слое.
Кроме того, этот оператор возвращает только один объект, поэтому нумерация страниц не требуется.
Любой совет будет приветствоваться.
С уважением,
Стефан Эйберт
Решение
Вероятно, вы можете это сделать с помощью PageRequest
. http://docs.spring.io/spring-data/jpa/docs/1.6.2.RELEASE/reference/html/repositories.html#repositories.core-concepts
Hibernate хочет, чтобы вы сделали setMaxResults()
на Query
объект, но JPA не взаимодействует с ним напрямую.
Другим вариантом было бы использовать @NamedNativeQuery