[Resolvido] Hibernate - Mostrar dados presentes em classes diferentes (Join)

Olá a todos,

Iniciei um estudo sobre o Hibernate e tenho achado ele muito interessante, estou usando o NetBeans 6.8 e fiz o mapeamento de toda a minha base de modo automático, o Hibernate gerou todas as classes para mim.
Manipular os dados foi simples, desde que eu o esteja fazendo para uma única tabela… meu problema é que eu ainda não entendi como, por exemplo, buscar dados em duas tabelas (devidamente relacionadas).

Classe Dao:

public class Dao<T> {

    private final Session session;
    private Transaction transaction;
    private final Class classe;

    public Dao(Session session, Class classe) {
        this.session = session;
        this.classe = classe;
    }
    public List<T> listaTudo() {
        return this.session.createCriteria(this.classe).list();
    }
    public T procuraPorCod(Long id) {
        return (T) session.load(this.classe, id);
    }
    public List<T> sqlQuery(String sql) {
        return this.session.createSQLQuery(sql)
                .setResultTransformer(Transformers.aliasToBean(classe)).list();
    }

}

Classe DaoFactory:

public class DaoFactory {

    private final Session session;    

    public DaoFactory() {
        this.session = HibernateUtil.getSession();
    }

    public Dao<AteUsuarios> getUsuarioDao() {
        return new Dao<AteUsuarios>(this.session, AteUsuarios.class);
    }
    
}

Classe de usuários:

package domain;
// Generated 20/04/2010 10:00:19 by Hibernate Tools 3.2.1.GA


import java.util.HashSet;
import java.util.Set;

/**
 * AteUsuarios generated by hbm2java
 */
public class AteUsuarios  implements java.io.Serializable {


     private long codUsuario;
     private AteEmpresas ateEmpresas;
     private String nomUsuario;
     private String nomLogin;
     private String desSenha;
     private String desEmail;
     private Character flgAnalista;
     private Character flgAtivo;
     private Set ateUsuariosObjetoses = new HashSet(0);
     private Set ateSistemases = new HashSet(0);
     private Set ateChamadoses = new HashSet(0);
     private Set ateChamadoAtendidos = new HashSet(0);

    public AteUsuarios() {
    }

	
    public AteUsuarios(long codUsuario) {
        this.codUsuario = codUsuario;
    }
    public AteUsuarios(long codUsuario, AteEmpresas ateEmpresas, String nomUsuario, String nomLogin, String desSenha, String desEmail, Character flgAnalista, Character flgAtivo, Set ateUsuariosObjetoses, Set ateSistemases, Set ateChamadoses, Set ateChamadoAtendidos) {
       this.codUsuario = codUsuario;
       this.ateEmpresas = ateEmpresas;
       this.nomUsuario = nomUsuario;
       this.nomLogin = nomLogin;
       this.desSenha = desSenha;
       this.desEmail = desEmail;
       this.flgAnalista = flgAnalista;
       this.flgAtivo = flgAtivo;
       this.ateUsuariosObjetoses = ateUsuariosObjetoses;
       this.ateSistemases = ateSistemases;
       this.ateChamadoses = ateChamadoses;
       this.ateChamadoAtendidos = ateChamadoAtendidos;
    }
   
    public long getCodUsuario() {
        return this.codUsuario;
    }
    
    public void setCodUsuario(long codUsuario) {
        this.codUsuario = codUsuario;
    }
    public AteEmpresas getAteEmpresas() {
        return this.ateEmpresas;
    }
    
    public void setAteEmpresas(AteEmpresas ateEmpresas) {
        this.ateEmpresas = ateEmpresas;
    }
    public String getNomUsuario() {
        return this.nomUsuario;
    }
    
    public void setNomUsuario(String nomUsuario) {
        this.nomUsuario = nomUsuario;
    }
    public String getNomLogin() {
        return this.nomLogin;
    }
    
    public void setNomLogin(String nomLogin) {
        this.nomLogin = nomLogin;
    }
    public String getDesSenha() {
        return this.desSenha;
    }
    
    public void setDesSenha(String desSenha) {
        this.desSenha = desSenha;
    }
    public String getDesEmail() {
        return this.desEmail;
    }
    
    public void setDesEmail(String desEmail) {
        this.desEmail = desEmail;
    }
    public Character getFlgAnalista() {
        return this.flgAnalista;
    }
    
    public void setFlgAnalista(Character flgAnalista) {
        this.flgAnalista = flgAnalista;
    }
    public Character getFlgAtivo() {
        return this.flgAtivo;
    }
    
    public void setFlgAtivo(Character flgAtivo) {
        this.flgAtivo = flgAtivo;
    }
    public Set getAteUsuariosObjetoses() {
        return this.ateUsuariosObjetoses;
    }
    
    public void setAteUsuariosObjetoses(Set ateUsuariosObjetoses) {
        this.ateUsuariosObjetoses = ateUsuariosObjetoses;
    }
    public Set getAteSistemases() {
        return this.ateSistemases;
    }
    
    public void setAteSistemases(Set ateSistemases) {
        this.ateSistemases = ateSistemases;
    }
    public Set getAteChamadoses() {
        return this.ateChamadoses;
    }
    
    public void setAteChamadoses(Set ateChamadoses) {
        this.ateChamadoses = ateChamadoses;
    }
    public Set getAteChamadoAtendidos() {
        return this.ateChamadoAtendidos;
    }
    
    public void setAteChamadoAtendidos(Set ateChamadoAtendidos) {
        this.ateChamadoAtendidos = ateChamadoAtendidos;
    }

}

Classe objetos:

package domain;
// Generated 20/04/2010 10:00:19 by Hibernate Tools 3.2.1.GA


import java.util.HashSet;
import java.util.Set;

/**
 * AteObjetos generated by hbm2java
 */
public class AteObjetos  implements java.io.Serializable {


     private long codObjeto;
     private String desObjeto;
     private String nomPagina;
     private String imgPagina;
     private Character flgAtivo;
     private Set ateUsuariosObjetoses = new HashSet(0);

    public AteObjetos() {
    }

	
    public AteObjetos(long codObjeto) {
        this.codObjeto = codObjeto;
    }
    public AteObjetos(long codObjeto, String desObjeto, String nomPagina, String imgPagina, Character flgAtivo, Set ateUsuariosObjetoses) {
       this.codObjeto = codObjeto;
       this.desObjeto = desObjeto;
       this.nomPagina = nomPagina;
       this.imgPagina = imgPagina;
       this.flgAtivo = flgAtivo;
       this.ateUsuariosObjetoses = ateUsuariosObjetoses;
    }
   
    public long getCodObjeto() {
        return this.codObjeto;
    }
    
    public void setCodObjeto(long codObjeto) {
        this.codObjeto = codObjeto;
    }
    public String getDesObjeto() {
        return this.desObjeto;
    }
    
    public void setDesObjeto(String desObjeto) {
        this.desObjeto = desObjeto;
    }
    public String getNomPagina() {
        return this.nomPagina;
    }
    
    public void setNomPagina(String nomPagina) {
        this.nomPagina = nomPagina;
    }
    public String getImgPagina() {
        return this.imgPagina;
    }
    
    public void setImgPagina(String imgPagina) {
        this.imgPagina = imgPagina;
    }
    public Character getFlgAtivo() {
        return this.flgAtivo;
    }
    
    public void setFlgAtivo(Character flgAtivo) {
        this.flgAtivo = flgAtivo;
    }
    public Set getAteUsuariosObjetoses() {
        return this.ateUsuariosObjetoses;
    }
    
    public void setAteUsuariosObjetoses(Set ateUsuariosObjetoses) {
        this.ateUsuariosObjetoses = ateUsuariosObjetoses;
    }
}

E a classe usuarios/objetos:

package domain;
// Generated 20/04/2010 10:00:19 by Hibernate Tools 3.2.1.GA



/**
 * AteUsuariosObjetos generated by hbm2java
 */
public class AteUsuariosObjetos  implements java.io.Serializable {


     private AteUsuariosObjetosId id;
     private AteUsuarios ateUsuarios;
     private AteObjetos ateObjetos;
     private Character flgAcesso;

    public AteUsuariosObjetos() {
    }

	
    public AteUsuariosObjetos(AteUsuariosObjetosId id, AteUsuarios ateUsuarios, AteObjetos ateObjetos) {
        this.id = id;
        this.ateUsuarios = ateUsuarios;
        this.ateObjetos = ateObjetos;
    }
    public AteUsuariosObjetos(AteUsuariosObjetosId id, AteUsuarios ateUsuarios, AteObjetos ateObjetos, Character flgAcesso) {
       this.id = id;
       this.ateUsuarios = ateUsuarios;
       this.ateObjetos = ateObjetos;
       this.flgAcesso = flgAcesso;
    }
   
    public AteUsuariosObjetosId getId() {
        return this.id;
    }
    
    public void setId(AteUsuariosObjetosId id) {
        this.id = id;
    }
    public AteUsuarios getAteUsuarios() {
        return this.ateUsuarios;
    }
    
    public void setAteUsuarios(AteUsuarios ateUsuarios) {
        this.ateUsuarios = ateUsuarios;
    }
    public AteObjetos getAteObjetos() {
        return this.ateObjetos;
    }
    
    public void setAteObjetos(AteObjetos ateObjetos) {
        this.ateObjetos = ateObjetos;
    }
    public Character getFlgAcesso() {
        return this.flgAcesso;
    }
    
    public void setFlgAcesso(Character flgAcesso) {
        this.flgAcesso = flgAcesso;
    }
}

Hoje para um select simples eu faço o seguinte:


Dao dao = new DaoFactory().getUsuarioDao();
List<AteUsuarios> lista = dao.listaTudo();
for (AteUsuarios usuario : lista) {
     System.out.println(usuario.getCodUsuario()+" - "+usuario.getNomUsuario());
}

Minha dúvida é como eu devo fazer para retornar os objetos de um determinado usuário ?

du_nirvana,

Da mesma maneira que vc fez neste método, usando createCriteria sem nenhum filtro, você pode acrescentar filtros usando Example.

public List<T> listaTudo() {   
    return this.session.createCriteria(this.classe).list();   
} 

Exemplo:

public List<T> listaByExample(AteUsuarios usuario) {   
    Criteria criteria =  this.session.createCriteria(this.classe);
    Example example = Example.create(usuario);
    example.enableLike(MatchMode.ANYWHERE);
    example.ignoreCase();
    example.excludeProperty("ateUsuariosObjetoses");
    example.excludeProperty("ateSistemases");
    example.excludeProperty("ateChamadoses");
    example.excludeProperty("ateChamadoAtendidos");
    example.excludeProperty("ateEmpresas");
    example.excludeProperty("flgAnalista");
    example.excludeProperty("flgAtivo");

    criteria.add(example);
    
    return criteria.list();
}

Com este método, quando vc mandar um objeto AteUsuarios, ele vai filtrar com base nos seguintes atributos:

private String nomUsuario;
private String nomLogin;
private String desSenha;
private String desEmail;

Ou seja, se existir na base um usuário com o nome do usuário, login, senha e email conforme objeto de exemplo ele vai trazer. Ele vai fazer um AND entre estes atributos. Se o atributo estiver null ele não considera. Assim se vc instanciar um objeto AteUsuarios e setar somente nomUsuario, este método vai trazer todos os usuários que comparam com o atributo nomUsuario.

Veja também que existem:

example.enableLike(MatchMode.ANYWHERE);
example.ignoreCase();

Isso faz com que ele utilize like em todos os campos e também ignora se é maiúscula ou minúscula.

E esse método abaixo, exclui da seleção as propriedades que vc não deseja filtrar.

example.excludeProperty("ateUsuariosObjetoses");

@braços

Olá ccllss , muito obrigado pela atenção, a menos que eu tenha entendido errado o que você me passou foi como retornar dados do usuário (contidos na tabela de usuário), o que eu pretendo é retornar dados das tabelas de usuários e de objetos que esse usuário possui dentro do sistema, por exemplo:

Acima temos a relação na minha base, três tabelas distintas, a minha intenção é num mesmo select retornar dados do usuário e dos objetos que ele possue, em sql eu faria assim:

SELECT usu.cod_usuario
      ,usu.nom_usuario
      ,obj.des_objeto
      ,obj.nom_pagina
      ,obj.flg_ativo
  FROM ATE_USUARIOS         usu
      ,ATE_OBJETOS          obj
      ,ATE_USUARIOS_OBJETOS uob
 WHERE usu.cod_usuario = 2
   AND uob.cod_usuario = usu.cod_usuario
   AND uob.cod_objeto = obj.cod_objeto
 GROUP BY usu.cod_usuario
         ,usu.nom_usuario
         ,obj.des_objeto
         ,obj.nom_pagina
         ,obj.flg_ativo

Essa consulta me retornaria todos os objetos que o usuário com o código 2 possui, como aqui estou buscando dados de tabelas diferentes e no Hibernate tenho classes diferentes para cada tabela eu não sei como retornar esses dados, não sei se devo criar uma nova classe com os dados das duas ou se existe um modo de utiliza-las separadas.

Abraços…

du_nirvana,

No mesmo método que te passei vc pode acrescentar para ele trazer suas coleções. Se vc observar a query gerada pelo Hibernate será semelhante ao que vc passou. E para recuperar o AteUsuario com código 2 basta atribuir este valor no atributo “codUsuario”.


public List<T> listaByExample(AteUsuarios usuario) {     
    Criteria criteria =  this.session.createCriteria(this.classe); 

    criteria.setFetchMode(ateUsuariosObjetoses, FetchMode.JOIN);
    criteria.setFetchMode(ateSistemases, FetchMode.JOIN);
    criteria.setFetchMode(ateChamadoses, FetchMode.JOIN);
    criteria.setFetchMode(ateChamadoAtendidos, FetchMode.JOIN);

    Example example = Example.create(usuario);   
    example.enableLike(MatchMode.ANYWHERE);   
    example.ignoreCase();   
    example.excludeProperty("ateUsuariosObjetoses");   
    example.excludeProperty("ateSistemases");   
    example.excludeProperty("ateChamadoses");   
    example.excludeProperty("ateChamadoAtendidos");   
    example.excludeProperty("ateEmpresas");   
    example.excludeProperty("flgAnalista");   
    example.excludeProperty("flgAtivo");   
  
    criteria.add(example);   
       
    return criteria.list();   
}

@braços

Olá novamente ccllss, fico muito agradecido pela prontidão nas respostas, parece que desse modo terei as informações, mas tenho outra duvida, nesse trecho do código onde recupero os dados eu monto uma lista para meu tipo usuario, e depois mostro os dados.

Dao dao = new DaoFactory().getUsuarioDao();
// lista usuarios
List<AteUsuarios> lista = dao.listaTudo();
for (AteUsuarios usuario : lista) {
   System.out.println(usuario.getCodUsuario()+" - "+usuario.getNomUsuario());
}

Como eu devo proceder nesse caso onde terei dados de mais de uma tabela?
Quando a consulta retorna apenas dados de uma única tabela é simples, mas para mais de uma não estou conseguindo visualizar como fazer.

Abraços…

du_nirvana,

Brow… Veja abaixo:


Dao dao = new DaoFactory().getUsuarioDao();   
// lista usuarios   
List<AteUsuarios> lista = dao.listaTudo();   
for (AteUsuarios usuario : lista) {   
    System.out.println(usuario.getCodUsuario()+" - "+usuario.getNomUsuario());

    Set<AteUsuariosObjetos> ateUsuariosObjetos  = AteUsuarios.getAteUsuariosObjetoses();
    Set<AteSistemas> ateSistemas = AteUsuarios.getAteSistemases();
    Set<AteChamados> ateChamados = AteUsuarios.getAteChamadoses();
    Set<AteChamadoAtendidos> ateChamadosAtendidos = AteUsuarios.getAteChamadoAtendidos();

    for (AteUsuariosObjetos objeto : ateUsuariosObjetos) {   
        System.out.println(objeto.getCodObjeto() + " - " + objeto.getDesObjeto());   
    }

    for (AteSistemas sistema: ateSistemas) {   
        System.out.println(objeto.getCodSistema() + " - " + objeto.getDesSistema());   
    }

    for (AteChamados chamado : ateChamados) {   
        System.out.println(objeto.getCodChamado() + " - " + objeto.getDesChamado());   
    }

    for (AteChamadoAtendidos chamadoAtendido : ateChamadosAtendidos) {   
        System.out.println(objeto.getCodChamadoAtendido() + " - " + objeto.getDesChamadoAtendido());   
    }

}  

@braços

Perfeito ccllss !

Era exatamente isso o que eu queria saber, o Hibernate é realmente poderoso e simples.
Mais uma vez obrigado pelas respostas e pela paciência.

du_nirvana,

Disponha no fórum.

@braços