You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot 3.1.0(JDK17)升级后JPA HQL LIKE查询异常求助

Spring Boot 3.1.0升级后JPA HQL LIKE查询报错解决

问题场景

将项目从Spring Boot 3.0.6升级至3.1.0(搭配JDK17)后,原本正常运行的带命名参数的HQL LIKE查询出现运行时错误,触发条件为字符串列LIKE语句中使用%:参数名%的写法。开启logging.level.org.hibernate.orm.query.hql=DEBUG配置后必现该问题,旧版本Spring Boot(<3.0.6)无此异常。

示例出错代码:

@Query("SELECT m FROM Movie m WHERE m.title LIKE %:title%")
List<Movie> searchByTitleLike(@Param("title") String title);

报错原因

从错误栈可以定位到问题根源:开启HQL的DEBUG日志后,Hibernate使用String.format输出日志内容,但HQL语句中的%符号被误判为格式化占位符,后续的'被识别为无效的转换格式符,最终抛出UnknownFormatConversionException。这是Spring Boot 3.1.0升级带来的Hibernate版本变更引发的日志格式化bug。

解决方案

方案1:修改HQL写法,避免直接在语句中写%

推荐将通配符拼接逻辑转移到参数或HQL内置函数中:

  • 方式A:使用CONCAT函数拼接通配符
@Query("SELECT m FROM Movie m WHERE m.title LIKE CONCAT('%', :title, '%')")
List<Movie> searchByTitleLike(@Param("title") String title);
  • 方式B:在调用方法时传入带通配符的参数
@Query("SELECT m FROM Movie m WHERE m.title LIKE :title")
List<Movie> searchByTitleLike(@Param("title") String title);
// 调用时传入格式如:"%关键词%"的参数

方案2:调整HQL日志级别

如果不需要HQL翻译的DEBUG日志,可修改配置降低日志级别以规避该bug:

logging.level.org.hibernate.orm.query.hql=INFO

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:13:14