Spring JDBC中使用Kotlin原生字符串作为NamedParameterJdbcTemplate的SQL插入语句报错问题
Spring JDBC中使用Kotlin原生字符串作为NamedParameterJdbcTemplate的SQL插入语句报错问题
你遇到的问题其实和Spring JDBC解析占位符无关,核心原因是Kotlin原生字符串(三重引号声明的字符串)会完整保留你输入的换行和空白字符,而你使用的DB2数据库对SQL语句中的空白格式比较敏感,那些多余的换行/空行导致数据库解析SQL时出现语法错误(从报错的SQLCODE=-104就能看出来,这是DB2的语法错误代码)。
你用字符串拼接的方式能正常工作,是因为拼接时你手动在每个片段末尾加了空格,最终生成的SQL是连续、格式规范的,没有多余的空行或换行干扰数据库解析。
解决这个问题很简单,只需要用Kotlin提供的字符串方法清理原生字符串里的多余空白即可,推荐两种方式:
方式1:使用trimMargin()
这个方法可以帮你去掉每行开头的标记(默认是|)和前导空白,让SQL格式更整洁:
val insertCommand = """INSERT INTO sqluser.my_table |(number_field, text_field, date_field, decimal_field, null_text_field) |VALUES (:number_field, :text_field, :date_field, :decimal_field, :null_text_field) """.trimMargin()
方式2:使用trimIndent()
这个方法会去掉所有行共有的前导空白,同时自动移除开头的空行:
val insertCommand = """ INSERT INTO sqluser.my_table (number_field, text_field, date_field, decimal_field, null_text_field) VALUES (:number_field, :text_field, :date_field, :decimal_field, :null_text_field) """.trimIndent()
这两种方法处理后,生成的SQL就和你用字符串拼接出来的格式一致了,DB2就能正常解析,Spring JDBC的占位符也能正常替换执行。
备注:内容来源于stack exchange,提问作者Twistleton
相关产品推荐
相关产品推荐

