java.sql.SQLException: groovy 服务 class 中的列索引无效

java.sql.SQLException: Invalid column index in groovy service class

我有一个代码:

def private prepare(params) {
    groovy.sql.Sql sql = new groovy.sql.Sql(dataSource);
    String variables = params.variables

    if(variables != null && variables != "") {
        def Paths = variables.split("\|")
        List conceptList = new ArrayList()

        Paths.each { cPath ->
            def row = sql.rows(""" SELECT firstname FROM person WHERE lastname like '${cPath}%' """).each { row ->
                conceptList.add(PersonHelperService.getLastnameFromKey(row.firstname))
            }
        }

        String[] conceptArray = conceptList.toArray()
        jobDataMap.put("c_cds", conceptArray);
    }
}

我在 运行 应用程序时确实遇到错误: java.sql.SQLException: 列索引无效

我在变量 Paths 中有某些路径的列表,这些路径已经被函数 split 分隔开。我很确定我在调用 sql.rows 时出错了。如果我将该部分连同它的每个功能一起注释掉,一切似乎都有效。但我确实需要 sql 语句来获取满足条件的行列表。 我在代码的哪一部分做错了?

我相信你对行的调用应该是

def row = sql.rows("SELECT firstname FROM person WHERE lastname like ${cPath + '%'}").each { 

我之前遇到的事情是 sql.rows 方法与 GString 有问题。

当你使用字符串插值时,那不是真正的字符串,实际上它是一个 GString。它们大多可以互换,但有时不能。

您可以使用 toString() 方法将 GString 转换为常规字符串。 我对你的建议是像这样重写你的查询:

sql.rows("SELECT firstname FROM person WHERE lastname like '${cPath}%'".toString())

另一个可能更简洁的解决方案是首先将查询分配给字符串变量。

String query = "SELECT firstname FROM person WHERE lastname like '${cPath}%'"
sql.rows(query).each { row -> ... }

祝你好运!

下面的成功了,谢谢大家:

def source= cPath+'%';
            def row = sql.rows(""" SELECT firstname FROM person WHERE lastname like 'source' """)