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 :
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:
Lo vamos a pasar al siguiente bean:
Es importante definir el constructor, ya que ahí es donde se setteará los valores.
DAO:
En este hql estamos utilizando 3 atributos, por lo tanto el bean realizará el "set" en un constructor de 3 parámetros.
Muchas veces cuando se trabaja con objetos de hibernate tenemos problemas para mostrarlo en la vista, ya sea :
- Los objetos son muy cargados
- Para obtener el valor que queremos en el registro que se encuentra en la grilla, los buscamos por punto (ejemplo : documento.registro.nuRegistro)
- 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
Solo una consulta, ¿cómo podría aplicarlo para traer datos de varias tablas?
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!
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)