[RESOLVIDO]Consulta JPQL com join

Senhores,

Estou tentando fazer um join em JPQL. Este é o primeiro projeto que uso o Hibernate com JPA, por isso tó apanhando um bocado.eheheh!

Já procurei um bocado por ai, mas não encontrei uma resposta que ajudasse, estou indo por indução lógica agora pra ver se acerto. Mas até agora não consegui…

Estou querendo um join bem simples, mais ou menos o que está ai abaixo:

Query q = em.createQuery("select c.codigo, c.descricao, d.descricao from Comunicacao c join Meio d on c.codMeio = d.codigo");

alguém poderia ajudar este pobre aventureiro a desvendar este mistério???

Grato,

Maurijava.

Como estão tuas entidades?

Em geral você não precisa fazer o join, o hibernate faz automaticamente (quando tu tenta acessar o atributo na classe Comunicacao, ele carrega os dados da tabela Meio).

Leia aqui: JPA Consultas e Dicas.

wagnerfrancisco

Segue as classes pra tu dar uma olhada:
@Entity
@Table(name = "COMUNICACAO")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Comunicacao.findAll", query = "SELECT c FROM Comunicacao c"),
    @NamedQuery(name = "Comunicacao.findByCodigo", query = "SELECT c FROM Comunicacao c WHERE c.codigo = :codigo"),
    @NamedQuery(name = "Comunicacao.findByDescricao", query = "SELECT c FROM Comunicacao c WHERE c.descricao = :descricao")})
public class Comunicacao implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "CODIGO")
    private Integer codigo;
    @Column(name = "DESCRICAO")
    private String descricao;
    @JoinColumn(name = "COD_MEIO", referencedColumnName = "CODIGO")
    @ManyToOne
    private Meio codMeio;
    @OneToMany(mappedBy = "comunicacao")
    private List<Equipamentos> equipamentosList;

    public Comunicacao() {
    }

    public Comunicacao(Integer codigo) {
        this.codigo = codigo;
    }

    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Meio getCodMeio() {
        return codMeio;
    }

    public void setCodMeio(Meio codMeio) {
        this.codMeio = codMeio;
    }

    @XmlTransient
    public List<Equipamentos> getEquipamentosList() {
        return equipamentosList;
    }

    public void setEquipamentosList(List<Equipamentos> equipamentosList) {
        this.equipamentosList = equipamentosList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codigo != null ? codigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Comunicacao)) {
            return false;
        }
        Comunicacao other = (Comunicacao) object;
        if ((this.codigo == null && other.codigo != null) || (this.codigo != null && !this.codigo.equals(other.codigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return  "Comunicação: " + codigo + " - " + descricao;
    }
    
}

Classe Meio:

@Entity
@Table(name = "MEIO")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Meio.findAll", query = "SELECT m FROM Meio m"),
    @NamedQuery(name = "Meio.findByCodigo", query = "SELECT m FROM Meio m WHERE m.codigo = :codigo"),
    @NamedQuery(name = "Meio.findByDescricao", query = "SELECT m FROM Meio m WHERE m.descricao = :descricao")})
public class Meio implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "CODIGO")
    private Integer codigo;
    @Column(name = "DESCRICAO")
    private String descricao;
    @OneToMany(mappedBy = "codMeio")
    @JoinColumn(name="CODIGO",referencedColumnName="CODIGO",
            insertable= true, updatable= true)
    @Fetch(FetchMode.JOIN)
    private List<Comunicacao> comunicacaoList;

    public Meio() {
    }

    public Meio(Integer codigo) {
        this.codigo = codigo;
    }

    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    @XmlTransient
    public List<Comunicacao> getComunicacaoList() {
        return comunicacaoList;
    }

    public void setComunicacaoList(List<Comunicacao> comunicacaoList) {
        this.comunicacaoList = comunicacaoList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codigo != null ? codigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Meio)) {
            return false;
        }
        Meio other = (Meio) object;
        if ((this.codigo == null && other.codigo != null) || (this.codigo != null && !this.codigo.equals(other.codigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Meio: " + codigo + " - " + descricao;
    }
    
}

Como faço para pegar os dados da classe Meio que são carregados???

wagnerfrancisco

Entendi o que vc quis dizer.

chamei meuBean.codMeio.descricao.

Funciona que é uma beleza!

Meu, fica muito fácil assim… Gostei.

Valeu cara.

Sds,

Maurício.