Páginas

lunes, 21 de mayo de 2012

Bug en hql de Hibernate 3.2.5 usando sub-select

Usando la librería hibernate3-3.2.5.ga.jar nos ha saltado el siguiente error:

java.lang.NullPointerException at org.hibernate.hql.ast.tree.FromClause.findIntendedAliasedFromElementBasedOnCrazyJPARequirements(FromClause.java:120)
at org.hibernate.hql.ast.tree.FromClause.getFromElement(FromClause.java:107)
at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:81)

Con la siguiente query HQL:

hql = "select count(e.notif) from Estado e ";
hql += "where e.notif.idApp = :idaplic ";
hql += "and e.estado='BAJA' ";
hql += "and e.fechaHoraEstado=(select max(e1.fechaHoraEstado) from Estado e1 where e1.notif.id = e.notif.id) ";
hql += "and (select count(e2) from Estado e2 where e.notif.id = e2.notif.id and e2.estado=:estadoPreborrado)>0";
query = getJpaTemplate().getEntityManager().createQuery(hql);
query.setParameter("estadoPreborrado", estado.getMensaje());
query.setParameter("idaplic", idApp);
numNotifEstadoPreborrado = ((Long) query.getSingleResult()).intValue();

"Googleando" un poco, parece que es un bug reconocido que estará resuelto en versiones posteriores, pero si no se quiere cambiar de versión, la forma de lanzar la query sin problemas es cambiar el orden de las condiciones a:

hql = "select count(e.notif) from Estado e ";
hql += "where e.fechaHoraEstado=(select max(e1.fechaHoraEstado) from Estado e1 where e1.notif.id = e.notif.id) ";
hql += "and (select count(e2) from Estado e2 where e.notif.id = e2.notif.id and e2.estado=:estadoPreborrado)>0";
hql += "and e.notif.idApp = :idaplic ";
hql += "and e.estado='BAJA'";
query = getJpaTemplate().getEntityManager().createQuery(hql);
query.setParameter("estadoPreborrado", estado.getMensaje());
query.setParameter("idaplic", idApp);
numNotifEstadoPreborrado = ((Long) query.getSingleResult()).intValue();
Parece que las condiciones que impliquen una sub-select deben ser las primeras.

No hay comentarios:

Publicar un comentario