Groovy объединяет динамический запрос
Я немного новичок в 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 ответ
Решение
Я считаю, что есть проблема при построении запроса с вопросительными знаками.
Здесь вы найдете фиксированный с парой вещей, чтобы отметить
- Использование метода без прохождения
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)
Вы можете быстро попробовать это демо (только часть построения запроса) онлайн.
Надеюсь, что выше это полезно.