Tenho as seguintes classes:
Pais 1 X N Estado 1 X N Municipio 1 X N Propriedade
@Entity
public class Pais implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Column(nullable=false, unique=true)
@NotNull
private String nome;
@OneToMany(mappedBy="pais")
private List<Estado> estados;
@Entity
public class Estado implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Column(nullable=false, unique=true)
@NotNull
private String nome;
@ManyToOne(fetch=FetchType.LAZY)
@NotNull
private Pais pais;
@OneToMany(mappedBy="estado")
private List<Municipio> municipios;
@Entity
public class Municipio implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Column(nullable=false, unique=true)
@NotNull
private String nome;
@ManyToOne(fetch=FetchType.LAZY)
@NotNull
private Estado estado;
@OneToMany(mappedBy="municipio")
private List<Propriedade> propriedades;
@Entity
public class Propriedade implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Column(nullable=false)
@NotNull
private String nome;
@Column(nullable=false)
@NotNull
private Date dataCriacao;
@ManyToOne(fetch=FetchType.LAZY)
@NotNull
private Municipio municipio;
Bom, a partir deste modelo de classes, criei uma nova classe para amazenar uma lista que já pudesse ser carregada com os devidos objetos organizados, ou seja, para poder carregar uma lista de todas as propriedades com seus respectivos municipios, estados e países.
public class PropriedadeMunEstPaObj implements Serializable{
private static final long serialVersionUID = 1L;
private Propriedade propriedade;
private Municipio municipio;
private Estado estado;
private Pais pais;
No meu pacote DAO criei a classe PropriedadeDAO e coloquei o consulta que retorna todos os dados.
@SuppressWarnings(“unchecked”)
public List<PropriedadeMunEstPaObj> listaPropriedadeMunEstPaObjs(){
String sql = "from Propriedade propriedade " +
"join propriedade.municipio as municipio " +
"join municipio.estado as estado " +
“join estado.pais as pais”;
Query query = ss.createQuery(sql);
return query.list();
}
A query executada no banco é :
?select
propriedad0_.id as id4_0_,
municipio1_.id as id8_1_,
estado2_.id as id7_2_,
pais3_.id as id6_3_,
propriedad0_.dataCriacao as dataCria2_4_0_,
propriedad0_.marker as marker4_0_,
propriedad0_.municipio_id as municipio6_4_0_,
propriedad0_.nome as nome4_0_,
propriedad0_.zoom as zoom4_0_,
municipio1_.estado_id as estado4_8_1_,
municipio1_.marker as marker8_1_,
municipio1_.nome as nome8_1_,
estado2_.nome as nome7_2_,
estado2_.pais_id as pais3_7_2_,
pais3_.nome as nome6_3_
from
Propriedade propriedad0_
inner join
Municipio municipio1_
on propriedad0_.municipio_id=municipio1_.id
inner join
Estado estado2_
on municipio1_.estado_id=estado2_.id
inner join
Pais pais3_
on estado2_.pais_id=pais3_.id?
[b]e retorna todas as colunas de todas as tabelas…
mas quando executo o teste…[/b]
public static void main(String[] args) {
Long inicio = System.currentTimeMillis();
Session session = new HibernateUtil().getSession();
session.getTransaction().begin();
List<PropriedadeMunEstPaObj> propriedadeMunEstPaObjs = new PropriedadeDAO(session).listaPropriedadeMunEstPaObjs();
for(PropriedadeMunEstPaObj result: propriedadeMunEstPaObjs){
result.getPais().getNome();
result.getEstado().getNome();
result.getMunicipio().getNome();
result.getPropriedade().getNome();
}
session.getTransaction().commit();
session.close();
Long fim = System.currentTimeMillis();
System.out.println("");
System.out.println("Execução em " +(fim - inicio) + " ms.");
}
}
[b]Ocorre o seguinte erro…
Exception in thread “main” java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to br.com.frontfaces.view.PropriedadeMunEstPaObj
at br.com.frontfaces.testes.TestaListaPropriedadeMunEstPaObjs.main(TestaListaPropriedadeMunEstPaObjs.java:20)
Minha intenção é carregar toda esta lista com 1 único acesso ao Banco de Dados…
Não sei se estou indo para o lado certo… Consegui carregar a lista descrita, mas somente com vários acessos ao banco de dados…
Agradeço se puderem me sugerir uma maneira de fazer isso…
[/b]