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???
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).
@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")})publicclassComunicacaoimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@Basic(optional=false)@Column(name="CODIGO")privateIntegercodigo;@Column(name="DESCRICAO")privateStringdescricao;@JoinColumn(name="COD_MEIO",referencedColumnName="CODIGO")@ManyToOneprivateMeiocodMeio;@OneToMany(mappedBy="comunicacao")privateList<Equipamentos>equipamentosList;publicComunicacao(){}publicComunicacao(Integercodigo){this.codigo=codigo;}publicIntegergetCodigo(){returncodigo;}publicvoidsetCodigo(Integercodigo){this.codigo=codigo;}publicStringgetDescricao(){returndescricao;}publicvoidsetDescricao(Stringdescricao){this.descricao=descricao;}publicMeiogetCodMeio(){returncodMeio;}publicvoidsetCodMeio(MeiocodMeio){this.codMeio=codMeio;}@XmlTransientpublicList<Equipamentos>getEquipamentosList(){returnequipamentosList;}publicvoidsetEquipamentosList(List<Equipamentos>equipamentosList){this.equipamentosList=equipamentosList;}@OverridepublicinthashCode(){inthash=0;hash+=(codigo!=null?codigo.hashCode():0);returnhash;}@Overridepublicbooleanequals(Objectobject){// TODO: Warning - this method won't work in the case the id fields are not setif(!(objectinstanceofComunicacao)){returnfalse;}Comunicacaoother=(Comunicacao)object;if((this.codigo==null&&other.codigo!=null)||(this.codigo!=null&&!this.codigo.equals(other.codigo))){returnfalse;}returntrue;}@OverridepublicStringtoString(){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")})publicclassMeioimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@Basic(optional=false)@Column(name="CODIGO")privateIntegercodigo;@Column(name="DESCRICAO")privateStringdescricao;@OneToMany(mappedBy="codMeio")@JoinColumn(name="CODIGO",referencedColumnName="CODIGO",insertable=true,updatable=true)@Fetch(FetchMode.JOIN)privateList<Comunicacao>comunicacaoList;publicMeio(){}publicMeio(Integercodigo){this.codigo=codigo;}publicIntegergetCodigo(){returncodigo;}publicvoidsetCodigo(Integercodigo){this.codigo=codigo;}publicStringgetDescricao(){returndescricao;}publicvoidsetDescricao(Stringdescricao){this.descricao=descricao;}@XmlTransientpublicList<Comunicacao>getComunicacaoList(){returncomunicacaoList;}publicvoidsetComunicacaoList(List<Comunicacao>comunicacaoList){this.comunicacaoList=comunicacaoList;}@OverridepublicinthashCode(){inthash=0;hash+=(codigo!=null?codigo.hashCode():0);returnhash;}@Overridepublicbooleanequals(Objectobject){// TODO: Warning - this method won't work in the case the id fields are not setif(!(objectinstanceofMeio)){returnfalse;}Meioother=(Meio)object;if((this.codigo==null&&other.codigo!=null)||(this.codigo!=null&&!this.codigo.equals(other.codigo))){returnfalse;}returntrue;}@OverridepublicStringtoString(){return"Meio: "+codigo+" - "+descricao;}}
Como faço para pegar os dados da classe Meio que são carregados???