HQL to bean

Después de haber pasado amanecidas de trabajo (hubiera preferido que sean de otras cosas) y no tener tiempo para postear, hoy me desocupé un poco para realizar este post.

Muchas veces cuando se trabaja con objetos de hibernate tenemos problemas para mostrarlo en la vista, ya sea :
  1. Los objetos son muy cargados
  2. Para obtener el valor que queremos en el registro que se encuentra en la grilla, los buscamos por punto (ejemplo : documento.registro.nuRegistro)
  3. Difícil acceso a los objetos internos de un objeto de Hibernate a traves de Ajax

Por lo que mejor sería mostrar beans simples en vez de estos objetos, pero sin perder la herramienta que facilita los querys de hibernate (hql)

Este es un ejemplo de como hacer un hql (hibernate query) y pasarlo a un bean.

Clase empleado que está mapeado por hibernate:


public class Employee {

private Integer employeeCode;
private String nroTel;
private Adrdress address;

.....
.....
...
}


Lo vamos a pasar al siguiente bean:



public class BeanEmpleado {

private Integer coEmpleado;
private String nroTelefono;
private String direccion; // descripción de la dirección


public BeanEmpleado(Integer coEmpleado, String nroTelefono, String direccion) {
super();
this.coEmpleado = coEmpleado;
this.nroTelefono = nroTelefono;
this.direccion = direccion;
}

public Integer getCoEmpleado() {
return coEmpleado;
}
public void setCoEmpleado(Integer coEmpleado) {
this.coEmpleado = coEmpleado;
}
public String getNroTelefono() {
return nroTelefono;
}
public void setNroTelefono(String nroTelefono) {
this.nroTelefono = nroTelefono;
}
public String getDireccion() {
return direccion;
}
public void setDireccion(String direccion) {
this.direccion = direccion;
}
}


Es importante definir el constructor, ya que ahí es donde se setteará los valores.

DAO:



public class EmpleadoDaoImpl extends HibernateDaoSupport implements Empleado{
public List obtenerEmpleados() {
StringBuffer hql = new StringBuffer();
hql.append("SELECT new ").append(BeanEmpleado.class.getName());
hql.append(" (employeeCode, nroTel, address.description) ");
hql.append(" FROM ");
hql.append(" Employee ");
return getHibernateTemplate().find(hql.toString());
}
}



En este hql estamos utilizando 3 atributos, por lo tanto el bean realizará el "set" en un constructor de 3 parámetros.

Comentarios

Unknown ha dicho que…
Muchas gracias por el aporte, es de gran ayuda.
Solo una consulta, ¿cómo podría aplicarlo para traer datos de varias tablas?
Christian Komiya ha dicho que…
De la misma manera, se tendría que tener mapeado todas las tablas en el contexto de hibernate y luego ampliar la consulta HQL, similar al ejemplo posteado "Hibernate : Lazy vs Left Join Fetch"
Unknown ha dicho que…
Hola Christian, gracias por la respuesta. Ya ví el post y justamente la combinación de los dos es lo que necesito, solo que aparece un nuevo problema, espero puedas ayudarme.
El problemas es el siguiente, la consulta la hago a una tabla con tres llaves primarias por lo que dentro del pojo Documento hay otro llamado DocumentoId y al momento de ejecutar el test me manda una excepción:
java.lang.NullPointerException
at org.hibernate.util.ReflectHelper.getConstructor(ReflectHelper.java:195)
at org.hibernate.hql.ast.tree.ConstructorNode.resolveConstructor(ConstructorNode.java:137)
at org.hibernate.hql.ast.tree.ConstructorNode.prepare(ConstructorNode.java:111)
at org.hibernate.hql.ast.HqlSqlWalker.processConstructor(HqlSqlWalker.java:862)
...

Supongo que es por las llaves, ya que lo probé con otros atributos del pojo Documento y no me marco error.

De antemano, gracias!
Christian Komiya ha dicho que…
Ok, si existe una tabla con 3 llaves, eso quiere decir que se genera un nuevo pojo llamado DocumentoId dentro de Documento, aún así apunta a un solo archivo hbm y la llave son 3 atributos encerrados entre etiquetas "composite-id"



El pojo Documento.java debe tener un constructor donde se encuentre ese DocumentoId (ya sea en el constructor mínimo, default o full. Generados por la herramienta)

Tambien puedes verificar de que también exista el getter y setter de DocumentoId dentro de Documento.java.


Cualquier consulta me puedes agregar em gtalk (christian.komiya@gmail.com) o msn (hotdavid7@hotmail.com)