2017-10-10 1 views
0

J'utilise le JPA Hibernate avec Spring Boot, et j'ai un problème pour renvoyer les résultats d'un CRUDRepository où j'ai écrit une requête SQL personnalisée en utilisant la balise @Query. Lorsque j'accède à DAO et exécute la méthode, il se déclenche correctement, mais rien n'est renvoyé à partir de la requête.@Query L'annotation ne remplit pas et n'exécute pas les paramètres

public interface ContactRepository extends CrudRepository<Contact, BigInteger> { 

    @Query(value ="SELECT * FROM all_contacts ac WHERE ac.userid= :userId " + 
      "AND LOWER(ac.city) LIKE CONCAT('%', LOWER(:city), '%')", 
      nativeQuery=true) 
    List<Contact> findAllUserContactsByCityPartialMatch(@Param("city") String city, @Param("userId") BigInteger userId); 

} 

et quand je tire hors du code dans un modèle ou contrôleur quelque part:

@Autowired 
ContactRepository contactDAO 

List<Contact> results = contactDAO.findAllUserContactsByCityPartialMatch("Chicago", 12345); 

results sera toujours vide

Mon enregistreur me dit qu'il est mise à feu de cette requête:

SELECT * FROM all_contacts ac 
WHERE ac.userid= ? AND LOWER(ac.city) LIKE CONCAT('%', LOWER(?), '%') 

Je sais que la requête est correcte, car lorsque je lance la requête et remplit les champs m anuellement dans le terminal MySQL, je reçois un résultat.

SELECT * FROM all_contacts ac 
WHERE ac.userid= 12345 AND LOWER(ac.city) LIKE CONCAT('%', LOWER("Chicago"), '%')` 

, je sais aussi la DB est correctement configuré, parce que si je lance dire

Iterable<Contact> contactItr = contactDAO.findAll(); 

dans le même modèle qui a été mentionné plus haut, je reçois plusieurs persista résultats retour de la DB. Je pense qu'il ne remplit pas les paramètres ou ne les exécute pas avec les paramètres de la classe CRUDRepository, mais je ne suis pas sûr. Des pensées? Merci!

Répondre

1

Les paramètres nommés ne sont pas pris en charge dans une requête native dans JPA. Vous pouvez utiliser des paramètres de position.

également vous pourriez utiliser la langue de requête JPA sans @Query à tous, quelque chose comme:

public interface ContactRepository extends CrudRepository<Contact, BigInteger> { 

    List<Contact> findAllByCityContainingIgnoreCaseAndUserId(String city, BigInteger userId); 

} 
+0

Aha, que presque œuvres, sauf qu'il génère une requête SQL en utilisant une Comme, mais ne pas ajouter de caractères génériques , ne renvoyant aucun résultat Ne devrait-il pas être lancé dans "%"? La fin d'une requête comme celle que vous avez écrite finit par être: 'from all_contacts contact0_ where (supérieur (contact0_.city) comme supérieur (?)) Et contact0_.userid =?' – NateH06

+0

Ah, je mettais '' '' s autour des paramètres de recherche du côté client où ils arrivaient, donc il n'ajoutait pas correctement les '%' ' Cependant, comment rechercherais-je des nombres partiellement complétés? Même juste un" commence par "? ajouter le% dans ce cas – NateH06