lunes, octubre 22, 2012

namedqueries con left join

Una de las funciones que más me gustan de gorm es la de namedQueries, que no son otra cosa que queries que viven dentro de las clases de dominio a los cuales se les puede aplicar metodos como list, count, y pasarles argumentos, etc.

Supongamos que tenemos la siguiente estructura de BD

Persona -> Ocupacion -> Categoria

Y que queremos contar el numero de personas por categoría, incluyendo aquellas que no tengan ocupacion (ocupacion = null), el problema es que para llegar a la solución necesitamos de dos left join con sql, recordando que los nameqQueries utilizan la misma nomenclatura que los criteria builder se nos ocurre que hay que ocupar CriteriaSpecification.LEFT_JOIN.

El siguiente namedQuerie dentro de persona hará nos solucionará el problema

groupByCategoria {params ->
            ocupacion(CriteriaSpecification.LEFT_JOIN) {
                categoria(CriteriaSpecification.LEFT_JOIN) { }
                projections {
                        groupProperty("categoria")
                        rowCount("total")
                }
            }
        }


Y ya podremos ocuparlo de la siguiente manera:

Persona.groupByCategoria.list()

Esto generará una lista como la siguiente:
[Categoria : 1:3, Categoria : 2:1, null:1]


Creo que nunca me va a gustar hibernate, sobre todo porque le quita todo el poder del lenguaje sql, peor bueno, cuando no hay otra solución más vale aprender bien la tecnología usada.

Publicar un comentario