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)

Вы можете быстро попробовать это демо (только часть построения запроса) онлайн.

Надеюсь, что выше это полезно.

Другие вопросы по тегам