Groovy构造MSSQL语句时如何避免${schema}后内容被识别为属性
问题原因
Groovy解析GString字符串时,默认会把${schema}.table1整体识别为「取schema变量的table1属性」,而不是你预期的「插值schema变量后拼接.table1字符串」,所以会抛出找不到table1属性的异常。
可行的解决方法
方法1:直接用字符串拼接,完全规避GString解析歧义
这是最稳妥不会出错的写法:
static createSQL(String schema){ def sql = "INSERT INTO " + schema + ".table1 VALUES(?)"; }
方法2:拆分插值部分,把点也作为插值内容输出
如果要保留GString写法,可以把点单独做插值,打断Groovy的属性访问解析逻辑:
static createSQL(String schema){ def sql = "INSERT INTO ${schema}${'.'}table1 VALUES(?)"; }
方法3:搭配MSSQL的方括号标识符语法使用
如果需要兼容带特殊字符的schema名,建议把schema和表名都用方括号包裹,提前处理好带括号的schema变量再插值:
static createSQL(String schema){ def quotedSchema = "[${schema}]" def sql = "INSERT INTO ${quotedSchema}.[table1] VALUES(?)" }
之前尝试的写法无效的原因
[${schema}].table1:Groovy仍然会把${schema}].table1识别为schema的属性,属性名非法自然找不到${schema}.[table1]:Groovy会尝试读取schema的[table1属性,不存在该属性${schema}\\.table1:反斜杠转义只作用于最终输出的字符串,不会打断Groovy对插值表达式的解析,还是会被识别为属性访问
内容的提问来源于stack exchange,提问作者NothingBox
相关产品推荐
相关产品推荐

