Sql Groovy, pass the value of an IN parameter

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 of five people;

From what I've noticed, I think you're not passing the list to the IN clause of the query, how should the query list be passed?

    
asked by anonymous 16.03.2015 / 17:29

1 answer

1

One way to solve this problem would be as follows:

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 parameters to a SQL.

If this bothers you a lot, another way to solve it would be this (see: ):

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 }
    
18.04.2015 / 00:26