You need to enable JavaScript to run this app. Spring Boot集成Azure Spring Data Cosmos参数化LIKE查询返回空问题
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot集成Azure Spring Data Cosmos参数化LIKE查询返回空问题

问题原因分析

核心问题是占位符被包裹在字符串字面量中,无法被Spring Data Cosmos正确识别替换:

  • 你写的@Query("SELECT * FROM c WHERE c.name LIKE \"%@searchString%\"")中,@searchString被放在双引号内部,属于字符串字面量的一部分。Spring Data Cosmos的@Query参数解析逻辑只会识别不在字符串字面量内的@Param对应的占位符,因此此处的@searchString不会被替换为传入的参数值,最终执行的查询实际是匹配c.name包含@searchString固定字符串的记录,自然返回空结果。

为什么另外两种写法可以正常执行?

  • 写死LIKE匹配值的写法不需要参数替换,查询语句直接原样执行,因此可以命中符合条件的数据。
  • 你提供的等值查询写法实际存在隐性问题:如果按照你给出的写法将@searchString放在单引号内,正常情况下同样不会被参数替换,你可以检查实际运行时的写法是否去掉了单引号,正确的参数化等值查询写法应该是SELECT * FROM c WHERE c.name = @searchString,不需要额外包裹引号,框架会自动根据参数类型处理格式。
正确的参数化LIKE查询写法

你可以选择以下任意一种方案修改:

  1. 参数传入时拼接通配符
    DAO层写法:
public interface UsersRespository extends CosmosRepository<User, String>  {
  @Query("SELECT * FROM c WHERE c.name LIKE @searchString")
  List<User> search(@Param("searchString") String searchString);
}

调用方法时给参数前后拼接%:

userRepository.search("%" + inputKeyword + "%");
  1. 查询语句中使用CONCAT拼接通配符
    DAO层直接完成拼接逻辑,调用方不需要额外处理:
public interface UsersRespository extends CosmosRepository<User, String>  {
  @Query("SELECT * FROM c WHERE c.name LIKE CONCAT('%', @searchString, '%')")
  List<User> search(@Param("searchString") String searchString);
}

内容的提问来源于stack exchange,提问作者Jibz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 21:24:02