Hibernate Criteria en Spring

By | 10 agosto 2009

Hibernate Criteria es una API que nos facilita las consultas (no las inserciones) a la base de datos. La ventaja fundamental de esta API es que nos permite tratar la composición de la consulta de una forma totalmente orientada a objetos. Es decir, no compone la consulta a través de una cadena insertada por nosotros mismos, sino que la compone la propia API a través de unas propiedades que nosotros establecemos.

En el ejemplo de la entrada anterior existe una clase GuardaController que hace una consulta a la base de datos. Ciertamente la consulta no tiene ningún tipo de dificultad, simplemente es una selección con una restricción sobre el usuario, pero para que os hagáis una idea os voy a poner los dos ejemplos, el ya expuesto, y como quedaría con Criteria, por supuesto integrado con Spring.

Sin Criteria.

Usuario usuario = new Usuario();

String query = "from Usuario where usuario = ?";

usuario = (Usuario) hibernateTemplate.find(query, "pedro").get(0);

Con Criteria. Lo único que tenemos que hacer es declarar el objeto Criteria como DetachedCriteria y una vez compuesto utilizar el metodo findByCriteria que nos suministra hibernateTemplate.

DetachedCriteria crit = DetachedCriteria.forClass(Usuario.class);
crit.add(Restrictions.like("usuario", “pedro”));

List usuarios = hibernateTemplate.findByCriteria(crit);

Tal vez en un ejemplo tan simple resulte un poco complicado entender todas las bondades de Criteria, sobretodo para el que lo ve por primera vez, pero os voy a poner un ejemplo bien simple que ya de por si, debería convenceros de utilizar Criteria.

Imaginaros que tenéis que realizar una consulta según varios parámetros, que a su vez, son todos opcionales, es decir, el usuario tiene un formulario de búsqueda, y puede seleccionar diferentes búsquedas, con diferente numero de parámetros, si no utilizáis Criteria, tendríais que estar analizando la existencia de cada parámetro e ir concatenando una misma cadena constantemente, sin embargo con Criteria, simplemente seria añadir su restricción al objeto.

DetachedCriteria crit = DetachedCriteria.forClass(Usuario.class);

if(request.getParameter(“usuario”) != null){
    crit.add(Restrictions.like(“usuario”, request.getParameter(“usuario”) ));
}

if(request.getParameter(“contrasena”) != null){
    crit.add(Restrictions.like(“usuario”, request.getParameter(“contrasena”) ));
}

…

List usuarios = hibernateTemplate.findByCriteria(crit);

Y Criteria hace el trabajo por nosotros.

Criteria permite hacer casi todo tipo de consultas que os podáis imaginar, las opciones son tan innumerables y están tan bien explicadas en esta pagina, que no considero necesario tener que explicaros las diferentes opciones existentes, no obstante, si tenéis alguna duda, como siempre, solo tenéis que preguntar.

Comparte esta entrada enShare on LinkedIn0Tweet about this on Twitter0Share on Facebook0Share on Google+0

6 thoughts on “Hibernate Criteria en Spring

  1. Laura

    Hola,

    Tengo una duda. Cuando creas la consulta a través del uso de Criteria, cuando vas añadiendo los criterios, creas una lista conjuntiva de criterios, ¿verdad?
    Imagínate que quieres hacer una consulta de coches rojos y de marca seat, el código sería algo así:

    DetachedCriteria crit = DetachedCriteria.forClass(Coche.class);

    crit.add(Restrictions.eq(¨color¨,rojo));
    crit.add(Restrictions.eq(¨marca¨,seat));
    List coches = hibernateTemplate.findByCriteria(crit);

    Pero si quisiera una consulta en la que me devolviese los coches que sean rojos o de marca seat, ¿Cómo podría hacerlo haciendo uso de Criteria?

    Gracias.

  2. admin Post author

    Hay que utilizar Restrictions.disjunction().

    Quedaría tal que así.

    DetachedCriteria crit = DetachedCriteria.forClass(Coche.class);

    crit.add(Restrictions.disjunction()
    .add(Restrictions.eq(¨color¨,rojo))
    .add(Restrictions.eq(¨marca¨,seat)));

    List coches = hibernateTemplate.findByCriteria(crit);

    Un saludo Laura.

  3. Roger

    Hola,
    donde podría encontrar una lista completa de cada función de la api hibernate criteria en español?, he buscado pero sin resultados, de antemano gracias.

  4. Rafael

    En Primer lugar gracias por la colaboracion!!!

    Yo hice de esta forma…

    String query = “from Dato d where d.dat_fecha <= ?";

    return this.template.find(query, new Date())

    funciono OK!!

    pero y si quiero colocar mas parametros como hago??? sin usar Criteria!!!

    gracias por todo!!!

  5. Rubén

    Hola buenos días,

    No se si podreis ayudarme con lo siguiente.

    Si tengo el criterio de una clase, por ejemplo:
    DetachedCriteria criteria = DetachedCriteria.forClass(Explotacion.class);
    Y otro criterio:
    DetachedCriteria criteriaCodEspecie =DetachedCriteria.forClass(ControlPorDefecto.class);

    criteria.add(Restrictions.like(“estadoExplotacion”, “00″, MatchMode.EXACT));
    criteria.add(Restrictions.like(“codigoLocal”, “001NA001″, MatchMode.EXACT));

    Como puedo añadir ambos criterios conjuntamente, ya que la variable criteria y criteriaCodEspecie estan en diferentes clases.
    lista = getHibernateTemplate().findByCriteria(criteria);
    lista = getHibernateTemplate().findByCriteria(criteriaCodEspecie );

    Dado que creo que lo anterior puesto no se puede hacer.

    No se si me explicado bien, disculpen si es el caso.

    Un saludo y gracias de antemano.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *