【问题标题】:how to pass value to LIKE statement in jpa native query如何在 jpa 本机查询中将值传递给 LIKE 语句
【发布时间】:2021-11-11 03:57:23
【问题描述】:

在这里,我正在尝试将字符串参数值传递给在 JPA 存储库中具有类似命令的本机查询

@Query(value = "select u.* from users where u.name like '%?1%'",nativeQuery = true)
List<User> findAllByNameContaining(String searchString);

当我尝试使用 show sql 标志进行调试时。我明白了,下面的结果是控制台

Hibernate: 
/* dynamic native SQL query */ select
    u.* 
from
    users u 
join
    customer c 
        on u.id = c.userId 
where
    c.trainerId = ? 
    and u.name like '%?2%'

我正在评估它添加额外的单引号(即),例如 '%'searchvalue'%'

注意:查询比这里提到的要复杂。所以,我不想要 findAllByNameContaining 或 findByNameIgnoreCaseContaining 等解决方案......

【问题讨论】:

标签: java mysql hibernate jpa


【解决方案1】:

在 jpql 中不能使用 nativeQuery = true

使用 Like 关键字:

List<User> findByNameLike(String searchString);

你也可以试试这个

@Query(value = "select u.* from users where u.name like %:searchString%")

【讨论】:

  • 正如我在问题中提到的,实际查询比这更复杂。所以,我需要一种在本机查询本身中添加 like 的方法
【解决方案2】:

当您将'%?2%' 放入查询中时,该查询不会扩展为在两侧与% 连接的参数。您不能将参数放在字符串文字中。

【讨论】:

    【解决方案3】:

    通过在搜索字符串中添加和附加 % 并按以下方式传递它来使其工作

    @Query(value = "select u.* from users where u.name like ?1",nativeQuery = true)
    List<User> findAllByNameContaining(String searchString);
    

    调用它

    List<Users> result = userRepository.findAllByNameContaining("%".concat(searchString).concat("%"));
    

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 2019-05-01
      • 2015-01-31
      • 2020-09-13
      • 2020-04-23
      • 2011-09-10
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多