jueves, 18 de marzo de 2010

Un poco de magia Groovy para construir clausulas SQL dinámicas

Para empezar, una entrada breve con un truco que aprendí/usé hace poco para construir una sentencia SQL dinámica usando Groovy. El problema reducido es el siguiente:
  • Dada una sentencia SQL que ha de hacer una comparación de una columna y cero, uno o varios valores, construir dinámicamente la sentencia teniendo en cuenta si se le pasa algún valor o varios.
Empezamos con la sentencia, que sería algo tal que así:
SELECT * FROM TAPP_TABLA WHERE TAB_CAMPO='VALOR'
donde podemos pasar cero, uno o varios valores.

La solución típica tiene unos cuantos if/else anidados, concatenaciones de cadenas etc. pero gracias a la mágia de Groovy, tenemos una solución sencilla y directa:

def parametrosMultiples = 'ABE,MUL,TAC,FRO' // o podría ser sólo 'ABE' o null
def condicionOR = parametrosMultiples?.split(',')?.join('\' OR TAB_CAMPO=\'')
def clausulaWhere = parametrosMultiples ? "WHERE TAB_CAMPO='${condicionOR}'" : ''
def sentencia = "SELECT * FROM TAPP_TABLA ${clausulaWhere}" 
println sentencia

Resultado:
SELECT * FROM TAPP_TABLA WHERE TAB_CAMPO='ABE' OR TAB_CAMPO='MUL' OR TAB_CAMPO='TAC' OR TAB_CAMPO='FRO'

Paso a paso:
  • En la primera linea: lo primero que hacemos es aplicar un split a la cadena que nos llega, lo cual la separa en trozos y lo convierte en una lista de valores.
  • En la misma linea: acto seguido hacemos un join de la lista lo cual nos vuelve a juntar todos los valores de la lista y los devuelve concatenados y separados por el separador que le indicamos. El separador está pensado para que enlace bien un valor con el siguiente, y la parte de inicio y fin se la pondremos después.
  • Resaltar que hemos añadido el interrogante ?. a ambas operaciones ya que si no lo hicieramos y el valor de la cadena parametrosMultiples es null, saltaría una NullPointerException.
  • Para evitar añadir la clausula WHERE si no es necesario, usamos el operador de asignación condicional: condición ? valorSiTrue : valorSiFalso.
  • Por último, interpolamos el valor de la variable clausulaWhere al final de la sentencia, haciendo uso de las facilidades de Groovy para introducir valores de variables en cadenas (usando dobles comillas y ${}). 
Veremos que si cambiamos el valor de parametrosMultiples por un valor simple o por null, la cadena devuelta es la correcta y no se produce ningún error.

Bueno, espero que este truquillo os de alguna idea de como poder usar la magia de Groovy para hacer algunas cosas de forma más sencilla.

¡Hasta la próxima!

PD: Resaltar que este truco es válido si nosotros mismos controlamos los valores que puede tomar la variable parametrosMultiples, ya que si no, al estar concatenando cadenas seríamos susceptibles a la Inyección SQL.

    No hay comentarios:

    Publicar un comentario