Skip to content

Instantly share code, notes, and snippets.

@mislas
Created February 16, 2012 01:44
Show Gist options
  • Save mislas/1840815 to your computer and use it in GitHub Desktop.
Save mislas/1840815 to your computer and use it in GitHub Desktop.
Como hacer consultas parametrizadas correctamente
//FORMA ACTUAL DE LAS CONSULTAS QUE RECIBEN PARÁMETROS
def obtenerTotalAportadoresQnaFonac(quincena){
PeriodosFonac.findAll("FROM PeriodosFonac WHERE $quincena AND aportacionEmpleado >0").size()
}
//FORMA CORRECTA DE PARAMETRIZAR
/** Consulta que regresa el numero total de aportadores al FONAC en la quincena especificada
* @param quincena hace el query en base a este parametro correspondiente al campo quincena del domain PeriodosFonac */
def obtenerTotalAportadoresQnaFonac(quincena){
println "FonacService.obtenerTotalAportadoresQnaFonac(quincena)"
/* USAR ESTE METODO PARA CONSULTAS CORRECTAMENTE PARAMETRIZADAS
* java.util.List findAll(java.lang.String query, java.util.Map params, java.util.Map args)
* LA PARAMETRIZACION REQUIERE UN CAST AL TIPO ESPECIFICO AL TIPO DE DATO DEL DOMINIO */
def query="FROM PeriodosFonac WHERE quincena =:quincena AND aportacionEmpleado >:aportacionEmpleado"
PeriodosFonac.findAll(query,[quincena:(Integer)quincena,aportacionEmpleado:(BigDecimal)0],[sort:'id',order:'desc']).size()
}
La primera expresión es la forma en la que se están haciendo las consultas que reciben parámetros, esto es = a solo concatenar el valor que se recibe, lo cual a pesar de funcionar y ser más rápido no es lo más correcto, puede propiciar inyección de SQL entre otras cosas, por tanto publico la forma correcta que nos brinda GRAILS para hacer consultas parametrizadas, más info en este enlace
http://grails.org/doc/latest/api/org/codehaus/groovy/grails/orm/hibernate/HibernateGormStaticApi.html
como dato curioso y altamente molesto pues no se menciona,es que hay que definir el tipo en concreto de las variables que se espera recibir a través de la parametrización, y la estructura es, el query como primer parametro, el mapa de los paramatros en segundo lugar y por ultimo el mapa con el paginado, orden etc...
Espero les sea de ayuda y se adopte.
Saludos cuicuinos.
@Joxebus
Copy link

Joxebus commented Feb 16, 2012

Muy buen aporte mi estimado, se ve que es un poco más de trabajo, pero cierto, no se me había ocurrido el caso de la inyección de sql.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment