Liquibase Update添加LIKE子句失效,是否需改用原生SQL?
Liquibase Update中LIKE子句失效的问题解决
你的代码存在两个核心问题导致无法正常执行,先修正这些问题再考虑是否切换到原生SQL:
1. 保留关键字未转义
from和to是SQL的保留关键字,直接作为列名使用会触发语法错误。需要根据你的数据库类型对列名进行转义:
- MySQL/MariaDB:用反引号包裹,例如
`from`、`to` - PostgreSQL/Oracle:用双引号包裹,例如
"from"、"to" - SQL Server:用方括号包裹,例如
[from]、[to]
2. LIKE子句缺少通配符
当前参数值TEST1、TEST2未添加%通配符,这会让LIKE退化为精确匹配(和=效果完全一致),自然无法达到模糊匹配的预期。有两种解决方式:
方式一:直接在参数值中加入通配符
<param name="first" value="%TEST1%"/> <param name="second" value="%TEST2%"/>
方式二:在WHERE子句中用数据库函数拼接通配符(更灵活)
以MySQL为例,使用CONCAT函数拼接:
<where> `from` LIKE CONCAT('%', :first, '%') OR `from` LIKE CONCAT('%', :second, '%') OR `to` LIKE CONCAT('%', :first, '%') OR `to` LIKE CONCAT('%', :second, '%') </where>
修正后的完整ChangeSet示例(MySQL)
<changeSet id="LoremIpsum" author="JohnDoe"> <update tableName="table_for_John_Doe"> <column name="id" value="000001"/> <where> `from` LIKE :first OR `from` LIKE :second OR `to` LIKE :first OR `to` LIKE :second </where> <whereParams> <param name="first" value="%TEST1%"/> <param name="second" value="%TEST2%"/> </whereParams> </update> </changeSet>
是否需要改用原生SQL?
如果修正上述问题后仍无法正常工作,或者你的业务逻辑涉及复杂的数据库特定语法,再考虑使用原生SQL。示例如下(MySQL):
<changeSet id="LoremIpsum" author="JohnDoe"> <sql> UPDATE table_for_John_Doe SET id = '000001' WHERE `from` LIKE '%TEST1%' OR `from` LIKE '%TEST2%' OR `to` LIKE '%TEST1%' OR `to` LIKE '%TEST2%'; </sql> </changeSet>
注意:原生SQL会失去Liquibase的跨数据库兼容性,仅建议在确定只针对单一数据库部署时使用。
内容的提问来源于stack exchange,提问作者xross
相关产品推荐
相关产品推荐

