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

时间:2015-04-22 21:28:11

标签: grails groovy

我有一个代码:

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中列出了已经被函数拆分分隔的某些路径的列表。我很确定在调用sql.rows时遇到错误。如果我评论该部分以及它的每个功能,一切似乎都有效。但我确实需要sql语句来获取满足条件的行列表。 我错误的代码的哪一部分?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我之前遇到的一点是sql.rows方法在使用GString时遇到了问题。

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

您可以使用toString()方法将GString转换为常规String。 我的建议是重写你的查询,如:

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

另一种可能更干净的解决方案是首先将查询分配给String变量。

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

答案 2 :(得分:-2)

以下工作,谢谢大家:

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