Указание предложения LIMIT в операторе @Query репозитория JPA2

StackOverflow https://stackoverflow.com//questions/25015612

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top