Dans un projet web, j'utilise la dernière version de spring-data (1.10.2) avec une base de données MySQL 5.6. J'essaie d'utiliser une requête native avec pagination mais je rencontre un problème d'affichage. org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
au démarrage.
UPDATE 20180306 Ce problème est maintenant corrigé en Printemps 2.0.4 Pour ceux qui sont toujours intéressés ou qui sont coincés avec des versions plus anciennes, consultez les réponses et les commentaires relatifs aux solutions de contournement.
Selon Exemple 50 à l'utilisation de @Query de la documentation de spring-data cela est possible en spécifiant la requête elle-même et un countQuery, comme ceci :
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);
}
Par curiosité, en NativeJpaQuery
je peux voir qu'il contient le code suivant pour vérifier si c'est une requête jpa valide :
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);
}
}
Ma requête contient un Pageable
donc hasPagingOrSortingParameter
es true
mais il cherche aussi un #pageable
o #sort
dans la séquence queryString
que je ne fournis pas.
J'ai essayé d'ajouter #pageable
(c'est un commentaire) à la fin de ma requête, ce qui fait que la validation passe mais ensuite, elle échoue à l'exécution en disant que la requête attend un paramètre supplémentaire : 3 au lieu de 2.
Le truc marrant c'est que, si je change manuellement containsPageableOrSortInQueryExpression
de false
a true
en cours d'exécution, la requête fonctionne bien, donc je ne sais pas pourquoi il vérifie que cette chaîne se trouve à ma position. queryString
et je ne sais pas comment la fournir.
Toute aide serait très appréciée.
Mise à jour du 30/01/2018 Il semble que les développeurs du projet spring-data travaillent sur un correctif pour ce problème à l'aide d'un fichier PR par Jens Schauder
0 votes
Non, je n'ai pas encore trouvé de solution. J'ai créé un ticket dans Spring JIRA mais il n'y a pas de réponse : jira.spring.io/browse/DATAJPA-928 . En fin de compte, je n'ai pas eu besoin de pagination et je n'ai donc pas essayé d'aller plus loin ou de pousser plus loin avec ce ticket.
3 votes
Ok, merci. Comme solution de rechange, vous auriez pu ajouter " \n #pageable \n "au lieu de "#pageable", mais j'espère que cela sera corrigé à l'avenir.
1 votes
Cette correction actuelle a empiré les choses pour moi. maintenant mon paramètre PageAble est complètement ignoré et la requête est exécutée de manière illimitée. donc si vous avez inséré ce fichier \n #pageable \n assurez-vous de le supprimer ou vous aurez des problèmes.