【问题标题】:JPA, why named parameter in native query is not replaced?JPA,为什么不替换本机查询中的命名参数?
【发布时间】:2019-06-13 17:09:39
【问题描述】:

我尝试了索引和命名参数,但它不起作用:

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是:

休眠:

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

为什么keyword-placeholder没有被我实际传递的参数代替?

【问题讨论】:

  • 它“未被替换”,因为它不是这样的命名参数。它是(部分)字符串文字(用引号括起来)。您需要将其放在引号之外作为参数
  • @tobi 我们的回答对您有帮助吗?请不要忘记标记它们...

标签: spring parameters spring-data-jpa jpql


【解决方案1】:

您的查询应该是这样的 -

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    你可以试试这个:

    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%");
    

    【讨论】:

      【解决方案3】:

      试试这个:

      JPQL/HQL

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

      本机(PostrgeSQL/MySQL)

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

      本机 (PostrgeSQL)

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

      Spring Data JPA 查询方法的替代变体

      List<Character> findByPinyinContaining(String pinyin); 
      

      附加信息:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-11
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-28
        • 2021-03-27
        • 2021-11-18
        • 2019-01-11
        相关资源
        最近更新 更多