Groovy连接到动态查询

时间:2017-11-29 02:23:28

标签: sql groovy groovy-sql

在Groovy的一个小新手中,我正在创建一段使用动态sql字符串执行sql查询的代码。

def executeQuery(String csvQueryInList) {
  def result = sql.rows('SELECT * FROM mySchema.myTable WHERE id IN (?,?)', ['1', '2'])
  return result
}

以上工作但现在我想更改此代码以使用参数csvQueryInList这是一个CSV字符串。

像这样......

  def sqlStr = 'SELECT * FROM mySchema.myTable WHERE id IN ('
    def executeQuery(String queryInList) {

        def values = queryInList.tokenize(", ")
        values.eachWithIndex { item, index ->
            sqlStr << '?,'
        }
        sqlStr << ')'

        println "Executing generated query: $sqlStr"
        def result = sql.rows(sqlStr, values)
        return result
    }

但它并没有起作用。

有人可以帮我纠正我的错误或提出更好的方法。

感谢

1 个答案:

答案 0 :(得分:1)

我认为在使用问号构建查询时存在问题。

在这里你可以找到一些需要注意的固定的

  • 使用方法而不传递sqlStr变量。
  • 而不是<<+可用于连接

将方法更改为也传递sqlStr

def sqlStr = 'SELECT * FROM mySchema.myTable WHERE id IN ('
def listStr =  '1,2 , 3, 50'

def executeQuery(String queryInList, String query){
        //Get the list values from the list
        def values = queryInList.split(',')*.trim()
        //Build the question marks string
        def listOfQuestions = values?.inject([]){ list, it -> list << '?';list }.join(',')
        query += listOfQuestions + ')'
        println "Executing generated query: $query"
        def result = sql.rows(query, values)
        return result
}
executeQuery(listStr, sqlStr)

您可以在线快速尝试 demo (仅查询构建部分)。

希望以上内容有用。