Init Developers

coding and blogging

Criterias, HQLs y SQLs al fin

Publicado por ggaray 5 Comentarios
1 Star2 Stars3 Stars4 Stars5 Stars6 Stars7 Stars8 Stars9 Stars10 Stars (1 votes, average: 8,00 out of 10)
Loading ... Loading ...

Hibernate mola.

Permite que hasta alguien como yo funcione con una base de datos sin necesidad (a priori, y si no queremos cosas demasiado raras) de saber absolutamente nada de SQL. Es lo más de lo más en ORMs.

“Yo sé de objetos, y con eso me debe bastar” es la filosofía subyacente. Básicamente, con unos estupendos ficheros XML se configura cómo mapeamos las tablas de la base de datos a los objetos (ValueObjetcs dentro del patrón DAO-VO) que queremos manejar; indicando qué campo(s) es(son) la PK, y estableciendo una relación entre cada campo de la tabla y cada campo del objeto (nombre de uno, nombre de otro y tipo [string, número, etc...]). Por supuesto, se pueden establecer relaciones 1-1, 1-n, n-1 y n-m entre las tablas que estamos mapeando, de manera que, por ejemplo, cuando consultemos un registro de una tabla, nos devuelva, de una vez y eliminando el problema de las 1+n consultas, todos los hijos de ese registro en otra tabla (en un Set asociado, por ejemplo).

Pero como no sólo de resultados vive el programador, los objetos también se usan para realizar las propias consultas. Lejos quedan las ataduras al “select * from” y del “left join on”, ahora lo que se lleva es hacer una Criteria con un Example, y como te das cuenta de que todo puede manejar un Object y un .class, pues te haces tu clase “base” para realizar todas las consultas sobre cualquier tabla mapeada con un sólo método. TOMA! Chúpate esa SQL!

Ya – pensaréis algunos – ¿y qué pasa si tengo que hacer un count, un distinct o una referencia a sysdate/now/… ? Pues nada, tiras de Projections, que para eso están, o tiras de un nivel de abstracción menor que te permite Hibernate: HQL.

HQL está en medio de los objetos puros y duros de Hibernate y el string puro y duro de una SQL. Así pues, sólo podía ser un string con objetos. Es decir, algo como: “from MiObjetoMapeado where campoFecha > sysdate”.

Donde seguimos sin necesitar saber (casi) nada de SQL, salvo, tal vez, que en lugar de tirar un (new Date()) tenemos que usar un sysdate para este ejemplo.

Y es que las expresiones que se pueden usar en una HQL son prácticamente todo lo que necesitas, como una buena navaja suiza. Puedes hacer cosas tan chulas como algo así:

hql += ” and (“+duracion+” between substr(duracion,0, instr(duracion, ‘-’)-1) and  substr(duracion, instr(duracion, ‘-’)+1) or duracion is null)”;

NOTA: Un sugus para quien comente qué estamos comparando con qué en esta cláusula where.

Pero como no todo se puede hacer, por ejemplo, que sé que lo tenéis en mente, llamar a una función que has hecho dentro de la base de datos para que te calcule algo internamente, algo como “select miFuncion(campo1) from tabla1″, pues nada, Hibernate también te deja ejecutar una SQL tal cual, como siempre, aunque tendrás que hacer algo más para parsear el resultado a un objeto tuyo…

… claro que siempre puedes incluir esta sentencia como una fórmula de un objeto mapeado, de manera que no necesites realmente tirar una fea SQL de esas que tan poco le gustan (o pueden llegar a gustarle) al responsable de cambiar Oracle por PostgreSQL o MySQL por SqlServer.

Porque la gracia de todo esto, además de facilitar el acercamiento del programador orientado a objetos al maravilloso mundo de las bases de datos, es hacer independiente, todo lo que permita la lógica de la aplicación que estemos desarrollando, de la base de datos.

Todo sea para que el MVC sea realmente MVC, y separemos las capas para aprovechar toda la flexibilidad que podamos sacar para adaptarnos a los futuros cambios que seguro nos pedirán…

… pero eso, como en el final de Conan, “it’s another story…”

Categorías: Destacados, Tutoriales

About ggaray

Soy un gnomo, y aquí en el bosque soy feliz, en un árbol vivo yo, junto a su raíz.

5 Respuestas hasta ahora.

  1. jmarti dice:

    Hibernate mola mas cuando en vez de xml, defines tus objetos mediante anotaciones. :-)

  2. ggaray dice:

    Yes my friend, pero eso irá después del de Conan :)

    Además, ya se trató en este gran post de Daisy.

    La idea era no mostrar Hibernate, sino proponer la hql que ha llevado nuestros límites de hql hasta cumbres insospechadas.

    :)

    Salu2!

  3. afernandez dice:

    Lo difícil de estas herramientas es el “¿Donde está qué cosa?”, lo mismo que pasa con Groovy y Grails por ejemplo.

    Mi pregunta, ¿es complejo aprender a usar este tipo de herramientas?

  4. ggaray dice:

    Que vaaaaa, muy fácil, y con anotaciones, como apuntan, mucho más sencillo. Eso sí, yo soy más de que lo cuenten a tener que digerirlo yo solito, pero eso al gusto. El enlace al post en el que lo explican junto con Spring es un buen inicio.

    No me parece más complicado que MyBatis, por ejemplo, y es mucho más potente.

    Salu2


Antes de enviar el formulario:
Human test by Not Captcha
  • RSS
  • Delicious
  • Digg
  • Facebook
  • Twitter
  • Linkedin
  • Youtube

Artículos populares

Ubuntu 11.04 y Unity, i

Cada 6 meses, los 04 y los 10 exactamente, algo...

Bonita Open Solution, u

En este post vamos a ver como iniciarnos en el...

Desarrollos con Liferay

Un gestor de portales A día de hoy existen múltiples...

Android, su SDK y sus X

Como bien sabréis una aplicación Android se basa en dos...

Adentrándose en la nub

Es curioso el revuelo generado por el Cloud Computing desde...