Friday, November 13, 2009

Pequeños detalles consumen grandes tiempos



Esto me pasa por creer que me las sé todas. Pero bueno, a veces el orgullo obliga a equivocarse más rápido de lo común y así aprender más.

Estabamos revisando un query con el framework IBatis , es muy genial ya que permite poner sentencias SQL en un XML para luego ejecutarlas desde Java.

Por ejemplo:

<select id="my-select-query"
parameterClass="java.lang.String"
resultClass="java.lang.String">
SELECT name as value FROM PERSONA
WHERE lastname = #lastName#
</select>

Lo que está entre gatos es el parámetro y hago un alias a value que será el retorno del Select.

Muy genial, pero se nos ocurrió la genial idea de tener otras dos tablas (para proteger la información de la aplicación, se usarán otros nombres de tablas), una llamada DEPARTAMENTO y otra llamada PERSONAS_DEPARTAMENTO para tener la relación de personas que pertenecen a un determinado departamento.

E hice el siguiente query para buscar a que departamento pertenece una persona.
  SELECT p.name , d.name as value
   FROM PERSONAS p, DEPARTAMENTO d, PERSONAS_DEPARTAMENTO pd
   WHERE p.id = pd.id_persona AND d.id = pd.id_depto AND p.name = #nombrePersona#

Al ejecutar con IBatis (vean el manual, no sean flojos). Me retornó el query null. Lo raro es que ya lo había ejecutado en el motor de base de datos sin problemas. Llamo a mi colega que tiene más experiencia para ver el problema. Y así perdimos el dia.

Resulto que despues de infructuosas 4 horas, era un maldito bug de IBatis en el cual no hacia nada si había en el query una tabla cuyo nombre fuera mezcla del nombre de otras tablas. Como  por ejemplo PERSONAS_DEPARTAMENTO. Eso lo descubrió mi colega al cambiar el nombre de la tabla a PERSONA_DEPTO y ver que mágicamente el query se ejecutó... ¡plop!.

Así que no se confíen. Por muy potente que sea el framework, siempre tiene sus mañas.

No comments: