Especificación de una cláusula LIMIT en una declaración @Query del repositorio JPA2

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

  •  21-12-2019
  •  | 
  •  

Pregunta

Tengo la siguiente declaración de MySQL:

  "SELECT * FROM $this->tableName WHERE news_publication_id = '" + newsPublicationId + "' AND list_order > '" + listOrder +"' ORDER BY list_order LIMIT 1"

Comencé el camino del manejo de datos haciendo primero una capa Hibernate DAO.

Tenía el siguiente método basado en criterios:

  @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();
  }

Y funciona bien.

Luego intenté hacer una capa de repositorio JPA2.

Ahora tiene el siguiente método basado en 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);

Pero no funciona.Porque la cláusula LIMIT no es válida.

Entonces me pregunto qué hacer.

¿Puedo seguir utilizando el método basado en criterios anterior en esta capa de repositorio JPA2?

Me gustaría evitar confiar en que el cliente pase el valor límite y prefiero codificar ese valor (de 1) en mi capa.

Además, esa declaración devuelve solo un objeto y, por lo tanto, no se necesita paginación.

Cualquier consejo será bienvenido.

Atentamente,

Stéphane Eybert

¿Fue útil?

Solución

Probablemente puedas hacer esto con un PageRequest. http://docs.spring.io/spring-data/jpa/docs/1.6.2.RELEASE/reference/html/repositories.html#repositories.core-concepts

Hibernate quiere que hagas setMaxResults() sobre el Query objeto, pero JPA no interactúa con eso directamente.

Otra opción sería utilizar un @NamedNativeQuery

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top