3
votes

JPA, pourquoi le paramètre nommé dans la requête native n'est pas remplacé?

J'ai essayé les deux, les paramètres indexés et nommés, mais cela ne fonctionne pas:

   SELECT
        * 
    FROM
        Character 
    WHERE
        pinyin like '%:keyword%'

Le sql sortant est:

Hibernate:

public interface CharacterRepository extends JpaRepository<Character, Long> {
    @Query(nativeQuery=true, value="SELECT * FROM Character WHERE pinyin like '%:keyword%'")
    List<Character> findByKeyword(@Param("keyword") String keyword);
}

Pourquoi l’espace réservé au mot-clé n’est-il pas remplacé par le paramètre que j’ai transmis?


2 commentaires

Il n'est "pas remplacé" car ce n'est pas un paramètre nommé comme ça. Il fait (partie) d'un littéral de chaîne (entouré de guillemets). Vous devez l'avoir en dehors des guillemets pour être un paramètre


@tobi Est-ce que nos réponses vous ont aidé? N'oubliez pas de les marquer ...


3 Réponses :


0
votes

Vous pouvez essayer ceci:

repository.findByKeyword("%myKeyword%");

et appeler la méthode comme ceci:

public interface CharacterRepository extends JpaRepository<Character, Long> {
    @Query(nativeQuery=true, value="SELECT * FROM Character WHERE pinyin like ':keyword'")
    List<Character> findByKeyword(@Param("keyword") String keyword);
}


0 commentaires

0
votes

Essayez ceci:

JPQL / HQL

List<Character> findByPinyinContaining(String pinyin); 

Natif (PostrgeSQL / MySQL) p >

select * from character c where c.pinyin like '%' || :keyword || '%'

Natif (PostrgeSQL)

select * from character c where c.pinyin like concat('%', :keyword, '%')

Variante alternative avec la méthode de requête Spring Data JPA

select c from Character c where c.pinyin like %:keyword%
select c from Character c where c.pinyin like concat('%', :keyword, '%')

Informations supplémentaires:


0 commentaires

3
votes

Votre requête doit ressembler à ceci -

@Query(nativeQuery=true, value="SELECT * FROM Character c WHERE c.pinyin like %:keyword%")
 List<Character> findByKeyword(@Param("keyword") String keyword);

J'espère que cela vous aidera.


0 commentaires