lunes, 13 de febrero de 2012

[Java] Informes con iReport y EJBQL

iReport es una herramienta magnífica para generar informes desde java, e incluso cuenta con un asistente que genera las consultas necesarias para atacar la base de datos.

Mi problema es que estaba diseñando una aplicación con JPA, y tener consultas en SQL en lugar de EJB-QL me parecía poco elegante. Hacerlo en ese dialecto cuando tenemos una única tabla es sencillo, pero cuando los datos provenían de varias tablas mediante un join la cosa se complica, porque iReport no reconoce alias y similares. Este es el modelo de datos:


La consulta en EJB-QL que recupera a los usuarios con su teléfono es:
SELECT u.idUsuario, u.nombre, ut.numTelefono, ud.nombreDepartamento 
FROM Usuario u JOIN u.telefono ut JOIN u.departamento ud
Puesta en su sitio en el archivo .jxrml sería así:

<queryString language="ejbql">
    <![CDATA[SELECT u.idUsuario, u.nombre, ut.numTelefono, ud.nombreDepartamento
      FROM Usuario u JOIN u.telefono ut JOIN u.departamento ud]]>
</queryString>

Pero no se puede hacer referencia a los campos mediante su nombre, sino mediante mediante el uso de alias específicos, COLUMN_1, COLUMN_2, etc.:
 
<field class="java.lang.String" name="COLUMN_1"></field>
<field class="java.lang.String" name="COLUMN_2"></field>
<field class="java.lang.String" name="COLUMN_3"></field>
<field class="java.lang.String" name="COLUMN_4"></field>

De ese modo funciona perfectamente.

Datos personales