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).
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.