JPA, почему именованный параметр в собственном запросе не заменяется? - PullRequest
0 голосов
/ 19 января 2019

Я пробовал оба, индексированные и именованные параметры, но это не работает:

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);
}

Исходящий sql:

Hibernate:

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

Почему ключевое слово-заполнитель не заменяется параметром, который я фактически передаю?

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Попробуйте это:

JPQL / HQL

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

Native (PostrgeSQL / MySQL)

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

Native (PostrgeSQL)

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

Альтернативный вариант с методом запроса JPA Spring Data

List<Character> findByPinyinContaining(String pinyin); 

Дополнительная информация:

0 голосов
/ 21 января 2019

Ваш запрос должен быть таким -

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

Надеюсь, это поможет.

0 голосов
/ 20 января 2019

Вы можете попробовать это:

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);
}

и вызвать метод следующим образом:

repository.findByKeyword("%myKeyword%");
...