在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
}
但它并没有起作用。
有人可以帮我纠正我的错误或提出更好的方法。
感谢
答案 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 (仅查询构建部分)。
希望以上内容有用。