Especificación de una cláusula LIMIT en una declaración @Query del repositorio JPA2
-
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
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