Sql Groovy, pass the value of an IN parameter

Asked

Viewed 304 times

2

I have the following code:

def pessoaIds = [1, 2, 3, 4, 5]

def query = "SELECT * FROM Pessoa WHERE id IN(?)"
def pessoaList = sql.rows(query, [pessoaIds])

In this case "personList" returns an empty list;

def query = "SELECT * FROM Pessoa WHERE id IN(1, 2, 3, 4, 5)"
def pessoaList = sql.rows(query)

In this case "personList" returns a list with the five people;

From what I noticed, I think you are not passing the list to the query’s IN clause, as the list should be passed to the query?

  • I don’t remember much from jdbc, but use: def query = "SELECT * FROM Pessoa WHERE id IN :pessoaIds"

  • I’ve tried using a key like the example you indicated and it still didn’t work.

  • if Voce uses grails, why not Pessoa.findAllById(pessoaIds)? or Pessoa.getAll(pessoasIds)?

1 answer

1

One way to solve this problem would be the following:

def pessoaIds = [1, 2, 3, 4, 5]
def inSql = ""

//Monta uma variável String que será os itens da lista
//pessoaIds separadas por vírgual
pessoasIds.each {inSql = inSql + it + ","}

//Retira a vírgula que sobra no processo de criar a variável acima
inSql = inSql.substring(0,inSql.lenght()-1)

//Monta a consulta, incluindo a variável acima
def query = """
  "SELECT * FROM Pessoa WHERE id IN(${inSql})"  
"""

//Como estamos fazendo query.toString(), a String será avaliada
//antes de ser passada como parametro para o método eachRow
//Parte da avaliação é interpretar a variável inSql colocando o seu
//conteúdo na String, ou seja, o valor passado para o eachRow é
//um SQL já montado e sem parametro
sql.rows(query.toString()) { row -> 
}

Note that I am not using parameters (? or :parameter) in SQL and this hurts the good principles of passing parameter to SQL.

If this bothers much, another way to resolve it would be this (see: http://groovy.329449.n5.nabble.com/In-operator-in-Groovy-SQL-td4768856.html):

def pessoaIds = [1, 2, 3, 4, 5]
def placeholders = []

//Monta um vetor de placeholders ? (para ser usado como parametro na query)
pessoaIds.each { placeholders << '?' }

//Monta a consulta, transformando o placeholders em uma string
//separada por virgula
def query = """
  "SELECT * FROM Pessoa WHERE id IN(${placeholders.join(',')})"  
"""

//Para esse caso, estamos efetivamente passando um parametro para
//a query
sql.rows(query, pessoaIds).each { println it }

Browser other questions tagged

You are not signed in. Login or sign up in order to post.