miércoles, 26 de diciembre de 2007

Criteria Query en Hibernate

Uno de los puntos débiles que encontré en el nuevo estándar JPA (Java Persistence API de Sun), es que no provee una funcionalidad análoga al Criteria Query de Hibernate.

El Criteria Query nos permite definir consultas con un estilo orientado a objetos, muy distinto al clásico SQL o HQL. La primera impresión del API me resultó un poco extraña, difícil de leer. Por ejemplo, el siguiente query con Criteria:


List personas = sess.createCriteria(Persona.class)
.add(Restrictions.like("nombre", "Fede%"))
.add(Restrictions.isNull("edad"))
.addOrder(Order.asc("nombre"))
.list();
sería el equivalente a éste otro con HQL:

String query = "from Persona where nombre like 'Fede%' and edad is not null order by nombre asc";
List personas = sess.createQuery(query).list();

Sin dudas el query HQL es mas fácil de leer a simple vista, la versión orientada a objetos requiere un análisis mas detallado.

Pero por otro lado, que sucedería si la consulta tuviera que armarse dinámicamente?
Por ejemplo, si el usuario selecciona las opciones por las cuales desea realizar la búsqueda, entonces el "where" del query debemos establecerlo en tiempo de ejecución. En éste caso es dónde personalmente le encuentro una gran ventaja al Criteria porque podemos hacer cosas como:

Criteria criteria = sess.createCriteria(Persona.class);
if (nombre != null) {
criteria.add(Restrictions.eq("nombre", nombre));
}
if (edad != null) {
criteria.add(Restrictions.eq("edad", edad));
}
if (pais != null) {
criteria.add(Restrictions.eq("pais", pais));
}
List personas = criteria.list();

El código anterior define una consulta que toma como entidad base a "Persona" y luego dependiendo de si hay un valor asignado para nombre, edad y país agrega las restricciones al Criteria.

Para resolverlo en HQL deberíamos armar el query concatenando strings, que no está mal, pero puede inducir a errores en la definición, me parece que en estos casos es mas natural usar el estilo orientado a objetos del Criteria.

Además permite desarrollar un esquema de consultas genérico, donde el usuario del sistema "arma" su propio query sin mayor esfuerzo por parte del desarrollador, en próximos posts publicaré ejemplos.

martes, 18 de diciembre de 2007

Una avenida en India

El fin de semana pasado, mientras borraba archivos viejos, encontré un video que filmé en el año 2004 cuando tuve que viajar por trabajo a Bangalore, India. Lo recuerdo como si fuera hoy, mientras estaba en una avenida llamaba Mahatma Gandhi comencé a filmar el tránsito que pasaba, de repente sin haberlo planeado entra en foco una persona caminando de una forma sumamente extraña, como pueden apreciarlo en el video mas abajo.
Unos días después volví a ver a otra persona en la calle caminando de la misma manera, me comentaron que es un problema relativamente común en India que se da por la descalcificación de los huesos.

En algún post futuro voy a contar otras experiencias bastante extrañas que viví en India...

Groupthink y el fanatismo tecnológico

En el último Encuentro Genexus participó un expositor argentino llamado Silvio Szostak, director de sistemas de cervecería Quilmes, habló sobre los factores humanos que influyen en el éxito o fracaso de los proyectos de sistemas.
Por lo general en éste tipo de charlas se exponen situaciones que ya hemos vivido, lo interesante es que uno descubre que tienen nombre y las particularidades han sido investigadas por profesionales.

Uno de los temas presentados fue el fenómeno groupthink, estudiado por Irving Janis en 1972: "Un modo de pensar en el que los participantes se ven atrapados en un grupo que lucha por imponer la unanimidad, anulando la evaluación de alternativas".

Cuando nos fanatizamos con un tema perdemos objetividad y eso se profundiza si nos movemos en ámbitos donde la gente comparte la misma "camiseta", para decirlo en términos futbolísticos.

Por ejemplo, ahora que está de moda el tema de las papeleras en Uruguay, cuando los medios de comunicación van a Fray Bentos y consultan a los pobladores sobre su opinión con respecto a Botnia, a veces me da la sensación que algunos contestan presionados por tener la cámara delante, temen opinar negativamente y ser señalados como traidores a la patria. Lo mismo sucede del otro lado del río Uruguay en Gualeguaychú, pero al revés.

Por otro lado, en la informática, quién se atrevería en una reunión de usuarios linux a opinar que prefiere usar el Microsoft Project para gestionar proyectos frente a las opciones open source?
O en una charla de programadores "devotos" de .NET quién se animaría a decir que para desarrollar y hostear un carrito de compras se inclinaría por PHP?
Sería como que una persona confesara que adora las achuras a la parrilla en un país donde las vacas son sagradas...

En posts anteriores dí mi opinión sobre la Guerra de Plataformas y sobre Bilardistas vs Menottistas en la Informática, sigo pensando que cuanto mas nos alejamos de los dogmatismos y de las posiciones extremistas, mas nos enriquecemos como profesionales.
En lo personal, como desarrollador Java desde hace varios años, no me tiembla la voz al reconocer las agilidad de desarrollo y la independencia tecnológica que se logra con Genexus, o las ventajas de una plataforma como .NET que ofrece un IDE integrado con todo lo que el programador necesita. Aclaro que estoy muy conforme con la tecnología Java, pero eso no quita que reconozca y tome lo bueno de las otras opciones.

En un blog vecino, del grupo DevelUY, leí un post titulado Talibanes del Software Libre, realmente me causó gracia el juego de palabras. Quiero rescatar la idea, si dejamos los fanatismos para otras actividades y evitamos caer en el groupthink, seguramente nos va a ir mejor.

Les dejo el link de la exposición, se las recomiendo en su totalidad, en el minuto 48 aproximadamente es dónde se habla sobre el groupthink.

Hasta el próximo post!!