Dibujo

Groovy y Grails, usando el GORM con métodos dinámicos

1 Star2 Stars3 Stars4 Stars5 Stars6 Stars7 Stars8 Stars9 Stars10 Stars (No Ratings Yet)
Loading ... Loading ...

Como bien decíamos en el post anterior una de las mejores cualidades de Grails es que recoge el apartado de conexión con BBDD de Groovy (GORM) y lo mejora añadiéndole una funcionalidad muy útil, creación dinámica de métodos para interrogar las tablas de una base de datos.

De este modo si tenemos una clase Domain con los siguientes campos que formaran parte de nuestra tabla una vez ejecutemos la aplicación:

package com.theinit.health.auth

import com.theinit.health.support.Constraints.Text

class Code {
	String userCode
	String email
    static constraints = {
		
		userCode nullable:true, blank:true, size:0..Text.MID
		email nullable:true, blank:true, size:0..Text.MID
    }
}

Nos generará los siguientes métodos:

def code = Code .findByUserCode(12)

code = Code .findByEmail(“example@example.com”)

code = Code .findAllByUserCode(12)

def email = “example@example.com”
code = Code .findAllByEmail(email)

Como podeis ver hay dos apartados que son troncales para todas las peticiones, findBy y findAllBy, el primero nos devuelve el primer resultado de la consulta y el segundo nos devuelve todos los registros generados por la consulta.
La segunda parte del método es la que Grails nos genera de manera dinámica añadiéndole el nombre que hemos definido en la clase Code. Pero eso no es todo ya que a parte de los dos primeros métodos todavía podemos incluir un parametro más para nuestra busqueda e incluso operadores lógicos OR / AND

LessThan – menor que el valor dado
LessThanEquals – menor o igual al valor dado
GreaterThan – mayor que el valor dado
GreaterThanEquals – mayor o igual que el valor dado
Like – Equivalente a una expresión SQL
Ilike – Similar a Like, pero insensitivo a las mayusculas
NotEqual – Niega igualdad
Between – Entre dos valores (Requiere dos valores)
IsNotNull – No es un valor nulo (No requiere argumento)
IsNull – Es un valor nulo (No requiere argumento)

De esta manera podemos tener query´s de este tipo:

def code = Code.findByEmailLike("%example.com")

def books = 
    Book.findAllByEmailLikeAndUserCodeGreaterThan("%example.com", 10)

Podemos incluso usar Criterias. ¿Os suenan?

def c = Account.createCriteria()
def results = c {
like(“holderFirstName”, “Fred%”)
and {
between(“balance”, 500, 1000)
eq(“branch”, “London”)
}
maxResults(10)
order(“holderLastName”, “desc”)
}

Recordad que Grails está basado en HQL y por lo tanto la query os devolverá un Objeto que contiene la información consultada.

Como habréis podido comprobar, consultar y crear tablas de una bases de datos con Grails se convierte en una tarea sencilla y rápida de realizar, siendo el despiece de ese objeto devuelto por la consulta lo único que puede darnos algún ligero de dolor de cabeza.

Para más información os recomiendo encarecidamente visitar la documentación oficial de Grails respecto a GORM ya que es muy completa y esta todo explicado de manera sencilla y clara.

¿Os parece una manera comoda de consultar la BBDD? ¿Habeis trabajado alguna vez con HQL? ¿Cual os gusta más?
Espero que este artículo os haya parecido útil, tanto para aprender como para trabajar con el.

Un saludo

  • http://www.incomodasverdades.tk ggaray

    Oye, podías comentar las “carencias” de gorm, ya que, por ejemplo, no se permiten más de 3 “AndCampoAComparar” en un “findBy”.

    Y claro, no veas tú qué gracia ponerte a hacer métodos para ello cuando se supone que “grails te lo hace todo”.

    Lo próximo a investigar es el comportamiento de grails (o hibernate en realidad), con bases de datos “no-sql” :)

    Salu2

    • afernandez

      Grails tiene muchas ventajas, es una lastima que las desventajas están más o menos a la misma altura.

      Si necesitas hacer consultas sencillas en una BBDD es muy sencillo de usar pero como bien dices una sentencia un poco más elaborada te puede llevar más tiempo, siendo la velocidad el mayor aporte de Grails.

      ¿Con que BBDD no-sql ves trabajando a Grails?

  • http://www.incomodasverdades.tk ggaray

    A mí siempre me ha llamado la atención la base de datos “no-sql” VOLDEMORT

    :)

    Salu2

  • jmarti

    Gorka está obsesionado con los NoSQL ultimamente. Pues yo diría que habría que ver con qué BD se conecta mejor: MongoDB, Cassandra, Redis y Membase.

    Tengo especial interés por Membase; es la más rápida y muy fácil para gestionar servidores en cluster (aunque para + de 2 es de pago en enterprise).

    En cuanto a GRAILS, para mí el problema es que cuando llegas a un momento en el que hago no funciona, no sabes si es un bug, o es que lo estás haciendo mal (generalmente lo segundo, pero ya sabéis cómo somos los humanos) :P

    • afernandez

      Sobre todo cuando tienes que esperar a compilar para saber si te falta alguna librería :S