el arreglo esta como fetch.EAGER por lo que al cargar la entidad aplicativo se trae todos los liberadores de la tabla join en ambos casos tanto el que si se efectua correctamente como el que no, copio mis clases mapeadas el codigo que efectua las consultas y una prueba usando junit para aclarar el caso:
package domain;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.CollectionOfElements;
@Entity
public class Aplicativos {
private String idAplicativo;
private String aplicativo;
private String activo;
private List <LiberadorContrata> liberadores = new ArrayList<LiberadorContrata>();
public Aplicativos(){
super();
}
@Id
public String getIdAplicativo() {
return idAplicativo;
}
public void setIdAplicativo(String idAplicativo) {
this.idAplicativo = idAplicativo;
}
public String getAplicativo() {
return aplicativo;
}
public void setAplicativo(String aplicativo) {
this.aplicativo = aplicativo;
}
public String getActivo() {
return activo;
}
public void setActivo(String activo) {
this.activo = activo;
}
@CollectionOfElements(fetch = FetchType.EAGER)
@JoinTable (name="ContratasLiberador", joinColumns = @JoinColumn(name = "idAplicativo"))
public List<LiberadorContrata> getLiberadores() {
return liberadores;
}
public void setLiberadores(List<LiberadorContrata> liberadores) {
this.liberadores = liberadores;
}
}
ahora la clase que representa la tabla join con los liberadores:
como puede verse el fetxh es un fetchType.Eager por lo que la lista se carga en el momento de hacer la consulta siempre. no solo cuando hago el select pidiendo especificamente que traiga el arreglo de liberadores
package domain;
import javax.persistence.*;
import org.hibernate.annotations.Parent;
@Embeddable
public class LiberadorContrata {
private Aplicativos aplicativo;
private Empleado empleado;
private String fechaRegistro;
private String usuarioRegistra;
private String activo;
@Parent
public Aplicativos getAplicativo() {
return aplicativo;
}
public void setAplicativo(Aplicativos aplicativo) {
this.aplicativo = aplicativo;
}
@ManyToOne
@JoinColumn(name = "idEmpleado", nullable= false, updatable= false)
public Empleado getEmpleado() {
return empleado;
}
public void setEmpleado(Empleado empleado) {
this.empleado = empleado;
}
@Column
public String getFechaRegistro() {
return fechaRegistro;
}
public void setFechaRegistro(String fechaRegistro) {
this.fechaRegistro = fechaRegistro;
}
@Column
public String getUsuarioRegistra() {
return usuarioRegistra;
}
public void setUsuarioRegistra(String usuarioRegistra) {
this.usuarioRegistra = usuarioRegistra;
}
@Column
public String getActivo() {
return activo;
}
public void setActivo(String activo) {
this.activo = activo;
}
}
esta clase contiene un atributo que representa a los empleados y campos de auditoria
por ultimo una clase dummy (la clase real tiene mas referencias que no importan para lo que esta sucediendo) que representa al empleado
package domain;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table (name="ContratasEmpleados")
public class Empleado {
private String idEmpleado;
private String nombre;
public Empleado(){
super();
}
@Id
public String getIdEmpleado() {
return idEmpleado;
}
public void setIdEmpleado(String idEmpleado) {
this.idEmpleado = idEmpleado;
}
public String getNombre() {
return empleado;
}
public void setNombre(String empleado) {
this.empleado = empleado;
}
}
a continuacion la clase que implementa los metodos que efectuaran los querys
package dao.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.hibernate.Session;
import org.hibernate.Transaction;
import AplicativosDao;
import domain.*;
import util.HibernateUtil;
public class AplicativosDaoImpl implements AplicativosDao {
public Aplicativos[] getAllAplicativos(){
Session newSession = HibernateUtil.getSessionFactory().openSession();
Transaction newTransaction = newSession.beginTransaction();
Aplicativos[] aplicativos = (Aplicativos[]) newSession.createQuery("from Aplicativos").list().toArray(new Aplicativos[0]);
newTransaction.commit();
newSession.close();
HibernateUtil.shutdown();
return aplicativos ;
}
public List<Aplicativos> getAplicativos( String idAplicativo, String idContrata){
Session newSession = HibernateUtil.getSessionFactory().openSession();
Transaction newTransaction = newSession.beginTransaction();
newTransaction.commit();
newSession.close();
HibernateUtil.shutdown();
return liberadores;
}
}
Como puede verse tanto el metodo getAplicativos como getLiberadores efectuan el mismo query solo se cambia la seccion del select
por ultimo un caso de prueba donde se llaman a los dos metodos el primero obtiene el aplicativo, puede entrar a su arreglo de liberadores y obtener el nombre del empleado y lo imprime correctamente, por lo que toda la estructura se carga correctamente
el segundo test efectua el mismo codigo solo cambia la llamada al query (ahora prueba con el que intenta obtener el arreglo de libradores y no el aplicativo) y lanza los errores que indique en mi correo previo Esto esta de acuerdo a lo que indicabas Fabricio? o el hecho del alias para la columna es solo para la seccion select?
package dao.impl;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.Test;
import domain.*;
public class AplicativosDaoImplTest {
@Test
public void testGetAplicativos() {
AplicativosDaoImpl aplicativosDao = new AplicativosDaoImpl();
List<Aplicativos> aplicativos = aplicativosDao.getAplicativos("1", "1");
assertTrue(aplicativos.size()>0 );
LiberadorContrata liberador = aplicativos.get(0).getLiberadores().get(0);
System.out.println(liberador.getEmpleado().getNombre());
}
@Test
public void testGetLiberadores() {
AplicativosDaoImpl aplicativosDao = new AplicativosDaoImpl();
List<LiberadorContrata> liberadores = aplicativosDao.getLiberadores("1", "1");
assertTrue(liberadores.size()>0 );
LiberadorContrata liberador = liberadores.get(0);
System.out.println(liberador.getEmpleado().getNombre());
}
}
espero esto aclare el caso que tengo