1

对 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
    }

但这并不完全奏效。

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

谢谢

4

1 回答 1

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(仅查询构建部分)。

希望以上内容有用。​</p>

于 2017-11-29T04:07:23.817 回答