En un proyecto web, usando los últimos datos de primavera (1.10.2) con una base de datos MySQL 5.6, estoy tratando de usar una consulta nativa con paginación pero estoy experimentando un org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
error al inicio.
ACTUALIZACIÓN : 20180306 Este problema ahora se solucionó en Spring 2.0.4 Para aquellos que aún están interesados o estancados con versiones anteriores, consulte las respuestas y comentarios relacionados para encontrar soluciones.
De acuerdo con el Ejemplo 50 en Usar @Query de la documentación de datos de primavera, esto es posible especificando la consulta en sí y un countQuery, así:
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
nativeQuery = true)
Page<User> findByLastname(String lastname, Pageable pageable);
}
Por curiosidad, en NativeJpaQuery
clase puedo ver que contiene el siguiente código para verificar si es una consulta jpa válida:
public NativeJpaQuery(JpaQueryMethod method, EntityManager em, String queryString, EvaluationContextProvider evaluationContextProvider, SpelExpressionParser parser) {
super(method, em, queryString, evaluationContextProvider, parser);
JpaParameters parameters = method.getParameters();
boolean hasPagingOrSortingParameter = parameters.hasPageableParameter() || parameters.hasSortParameter();
boolean containsPageableOrSortInQueryExpression = queryString.contains("#pageable") || queryString.contains("#sort");
if(hasPagingOrSortingParameter && !containsPageableOrSortInQueryExpression) {
throw new InvalidJpaQueryMethodException("Cannot use native queries with dynamic sorting and/or pagination in method " + method);
}
}
Mi consulta contiene un Pageable
parámetro, también lo hasPagingOrSortingParameter
es true
, pero también busca una secuencia #pageable
o #sort
dentro de queryString
, que no proporciono.
Intenté agregar #pageable
(es un comentario) al final de mi consulta, lo que hace que la validación pase, pero luego, falla en la ejecución y dice que la consulta espera un parámetro adicional: 3 en lugar de 2.
Lo curioso es que, si cambio manualmente containsPageableOrSortInQueryExpression
de false
a true
durante la ejecución, la consulta funciona bien, por lo que no sé por qué está verificando que esa cadena esté en mi queryString
y no sé cómo proporcionarla.
Cualquier ayuda será muy apreciada.
Actualización 30/01/2018 Parece que los desarrolladores del proyecto spring-data están trabajando en una solución para este problema con un PR de Jens Schauder