Boa tarde Galera,
Sou novato com a tecnologia JPA e estou tendo um problema em exemplo que estou fazendo.
No caso eu tenho 2 entidades (pais e estado), e não estou conseguindo fazer um select para trazer os estados com o id de um pais.
Segue minhas Classes:
Entida Pais:
package com.br.entidade;
@RemoteProxy
@DataTransferObject
@Entity
@Table(name = "pais")
public class Pais{
private Integer id_pais;
private String nome;
private List<Pais> paises = null;
private List<Estado> estados;
@RemoteProperty
@OneToMany(mappedBy="pais", fetch=FetchType.LAZY)
@OrderBy("nome ASC")
public List<Estado> getEstados()
{
return estados;
}
public void setEstados(List<Estado> estados)
{
this.estados = estados;
}
@RemoteProperty
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_pais")
public Integer getId_pais()
{
return id_pais;
}
public void setId_pais(Integer idPais)
{
id_pais = idPais;
}
@RemoteProperty
@Column(name = "nome")
public String getNome()
{
return nome;
}
public void setNome(String nome)
{
this.nome = nome;
}
@RemoteProperty
public List<Pais> getPaises()
{
return paises;
}
// public void setPaises(List paises)
// {
// this.paises = paises;
// }
@RemoteMethod
public void obterPaises()
{
paises = (List<Pais>)TaxonomyService.getInstance().obtemPaises();
DwrUtil.getUtil().removeAllOptions("cidade");
DwrUtil.getUtil().removeAllOptions("estado");
DwrUtil.getUtil().removeAllOptions("pais");
DwrUtil.getUtil().addOptions("pais", paises, "id_pais","nome");
}
@RemoteMethod
public void naoFazNada()
{
}
}
Entidade Estado:
package com.br.entidade;
@RemoteProxy
@DataTransferObject
@Entity
@Table(name="estado")
public class Estado{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id_estado;
private String nome;
private String sigla;
@ManyToOne
@JoinColumn(name="id_pais")
private Pais pais;
private List<Estado> estados = new ArrayList<Estado>();
@Column(name="id_estado", nullable=true)
public Integer getId_estado() {
return id_estado;
}
public void setId_estado(Integer idEstado) {
id_estado = idEstado;
}
@RemoteProperty
@Column(name="nome")
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@RemoteProperty
@Column(name="sigla")
public String getSigla() {
return sigla;
}
public void setSigla(String sigla) {
this.sigla = sigla;
}
public Pais getPais() {
return pais;
}
public void setPais(Pais pais) {
this.pais = pais;
}
// public List<Cidade> getCidades() {
// return cidades;
// }
//
// public void setCidades(List<Cidade> cidades) {
// this.cidades = cidades;
// }
@RemoteMethod
public void obterEstados(String valor)
{
estados = (List<Estado>)TaxonomyService.getInstance().obtemEstados(valor);
DwrUtil.getUtil().removeAllOptions("cidade");
DwrUtil.getUtil().removeAllOptions("estado");
DwrUtil.getUtil().addOptions("estado", estados, "nome");
}
}
Codigo com o select
public List<Estado> obtemEstados(String valor) {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT object(m) FROM Estado as m WHERE m.id_pais = :id_pais");
query.setParameter("id_pais", new Integer(valor));
return (List<Estado>) query.getResultList();
}
A seguinte exception é lançada
Caused by: Exception [EclipseLink-8030] (Eclipse Persistence Services - 1.1.2.v20090612-r4475): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Error compiling the query [SELECT object(m) FROM Estado as m WHERE m.id_pais = :id_pais], line 1, column 42: unknown state or association field [id_pais] of class [com.br.entidade.Estado].
at org.eclipse.persistence.exceptions.JPQLException.unknownAttribute(JPQLException.java:453)
at org.eclipse.persistence.internal.jpa.parsing.DotNode.validate(DotNode.java:77)
at org.eclipse.persistence.internal.jpa.parsing.Node.validate(Node.java:91)
at org.eclipse.persistence.internal.jpa.parsing.BinaryOperatorNode.validate(BinaryOperatorNode.java:34)
at org.eclipse.persistence.internal.jpa.parsing.EqualsNode.validate(EqualsNode.java:41)
at org.eclipse.persistence.internal.jpa.parsing.WhereNode.validate(WhereNode.java:34)
at org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:211)
at org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:187)
at org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:177)
at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateReadQueryInternal(JPQLParseTree.java:110)
at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateQuery(JPQLParseTree.java:84)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:160)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:134)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:91)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:78)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1065)
Se eu fizer um select sem a clausula where funciona, mas ele mes tras todo todos os países e todos os estados atrelados.
Caso alguem consiga me ajudar ficarei agradecido.
Abraço a todos.