Groovy Sql 中的参数化字段名称

Parameterized field names in Groovy Sql

我有一个小工具可以对数据库执行一些简单的操作。它根据 运行 toStringGString 上传递给它的配置(包括字段名称)将 SQL 查询放在一起。最近我一直在尝试摆脱 GString 并使用更安全的参数化查询功能。问题是我的可配置字段名称似乎不起作用。考虑这段代码:

import groovy.sql.Sql

Sql.withInstance('jdbc:comdb2://dev/brpcfgdb?comdb2dbname=comdb3db') { Sql sql ->
    sql.rows('SELECT * FROM docs WHERE :sourceFld IS :source', [sourceFld: 'source', source: 'www']).forEach { row ->
        println row
    }

    println "----------"

    sql.rows('SELECT * FROM docs WHERE source IS :source', [source: 'www']).forEach { row ->
        println row
    }
}

我希望在虚线上方和下方打印完全相同的行。相反,之前没有打印任何行,下面打印了预期的数字。

是否可以在参数化查询中指定字段名称? 或者我是否坚持连接 and/or GStrings?

无法传递参数化的 table 和列名称 - jdbc 驱动程序不支持此功能。

可以动态构建 sql,但可能会导致 sql 注入漏洞。

您可以通过以下代码完成:

def sourceFld = 'surce'
sql.rows('SELECT * FROM docs WHERE ${sourceFld} IS :sourceVal', [sourceVal: 'www']).forEach { row ->
    println row
}

Map params = [
    source: 'www'
]
String query = 'SELECT * FROM docs WHERE ' + params.collect{k,v-> "$k = :$k" }.join(' AND ')
sql.rows(query,params).forEach { row ->
    println row
}