Spring Boot应用出现SQL命令未正确结束错误的解决方法
解决Spring Boot中SQL「SQL command not properly ended」错误的方案
1. 修正LIKE语句的参数绑定方式
原SQL中%:query%的写法不符合JDBC参数绑定规范,部分驱动或ORM框架无法正确解析,可通过两种方式调整:
代码层拼接通配符:在Java代码中给
query参数前后添加%,SQL中仅保留LIKE :query:SELECT * FROM ACTIONS WHERE (var1 LIKE :query OR var2 LIKE :query) AND (ACTION IN :actions OR :length = 0) AND (code = :code)代码示例:
query = "%" + inputQuery + "%"SQL函数拼接:使用数据库原生拼接函数处理通配符,MySQL/Oracle可使用
CONCAT:SELECT * FROM ACTIONS WHERE (var1 LIKE CONCAT('%', :query, '%') OR var2 LIKE CONCAT('%', :query, '%')) AND (ACTION IN :actions OR :length = 0) AND (code = :code)
2. 修复IN子句的集合参数解析
如果:actions是集合类型(如List),需根据ORM框架调整写法:
- MyBatis场景:必须用
<foreach>标签遍历集合生成占位符,不能直接写IN :actions:<select id="queryActions" resultType="com.example.entity.Actions"> SELECT * FROM ACTIONS WHERE (var1 LIKE CONCAT('%', #{query}, '%') OR var2 LIKE CONCAT('%', #{query}, '%')) AND (ACTION IN <foreach collection="actions" item="action" open="(" separator="," close=")"> #{action} </foreach> OR #{length} = 0) AND (code = #{code}) </select> - JPA原生SQL场景:确保参数用
@Param("actions")标注,集合类型正确传递,部分JPA实现需将集合转为逗号分隔字符串适配语法。
3. 排查参数与数据库兼容性问题
- 检查
:length参数:若为数值类型,避免传递null,可改为COALESCE(:length, 0) = 0处理空值场景。 - 确认数据库版本变化:若数据库从MySQL切换到Oracle等,需适配新数据库的语法规则(如Oracle对空值、字符串拼接的要求更严格)。
4. 直接验证SQL语法完整性
将参数替换为实际值,在数据库客户端执行SQL(例如把:query换成'test',:actions换成('ACT1','ACT2')),排查是否存在语法错误,定位具体问题点。
内容的提问来源于stack exchange,提问作者sayedali musavi Khoeini
相关产品推荐
相关产品推荐

