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.
No hay comentarios.:
Publicar un comentario