Liquibase自定义customnvarchar类型逻辑作用于所有列,如何限定仅对应列?
解决Liquibase自定义类型逻辑仅作用于指定字段的问题
在Spring Boot + Liquibase项目中,自定义customnvarchar类型用于插入数据前替换特定员工姓名,但目前所有列都会执行该自定义类型的逻辑,导致运行耗时增加。以下是针对性的解决配置:
问题根源
自定义CustomNvarchar类的@DataTypeInfo注解中配置了aliases = {"java.lang.String"},这会让Liquibase将所有Java类型为String的列都关联到该自定义类型,从而触发全局的逻辑处理。
解决方案步骤
1. 修改自定义类型注解,移除String别名
修改CustomNvarchar.java中的@DataTypeInfo注解,删除aliases属性,确保仅明确指定customnvarchar类型的列才会使用该自定义逻辑:
@DataTypeInfo(name="customnvarchar", minParameters = 0, maxParameters = 1, priority = LiquibaseDataType.PRIORITY_DEFAULT+1) public class CustomNvarchar extends NVarcharType { @Override public String objectToSql(Object value, Database database) { if (value != null && !"null".equals(value.toString().toLowerCase(Locale.US)) && value.toString().contains("USERA")) { value = StringUtils.replace(value.toString(), "USERA", "USERB"); } return super.objectToSql(value, database); } }
2. 保持表结构的类型配置不变
确保creat_emp_table.yaml中仅目标列(如emp_name)使用customnvarchar类型,其他字符串列使用默认的nvarchar/varchar:
creat_emp_table.yaml - column: name: emp_name type: customnvarchar(32) # 其他列示例 - column: name: emp_dept type: nvarchar(64)
3. (可选)在loadUpdateData中显式指定列类型
如果CSV加载时Liquibase未自动识别列类型,可在load_emp.yaml中添加columns配置,明确指定目标列的类型:
load_emp.yaml databaseChangeLog: - changeSet: id: load_emp author: runOnChange: true changes: - loadUpdateData: schemaName: ${schemaName} tableName: emp primaryKey: emp_id file: emp/emp.csv relativeToChangelogFile: true columns: - column: name: emp_id type: int - column: name: emp_name type: customnvarchar(32) # 其他列按需配置对应类型
完成以上配置后,自定义类型的替换逻辑就只会作用于customnvarchar类型的字段,避免不必要的性能损耗。
内容的提问来源于stack exchange,提问作者user3387870
相关产品推荐
相关产品推荐

