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查询写法
你可以选择以下任意一种方案修改:
- 参数传入时拼接通配符
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 + "%");
- 查询语句中使用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
相关产品推荐
相关产品推荐

