Problema com select com JPA [ RESOLVIDO ]

4 respostas
Ivan_MV

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.

4 Respostas

renanreismartins

amigo recomendo vc dar uma olhadinha no code conventions pra nomear as variaveis…

tenta fazer:

Query query = em.createQuery("SELECT m FROM Estado as m WHERE m.id_pais = :id_pais");

e aqui vc nao deve passar um integer, e sim um objeto pais do qual vc quer os estados

query.setParameter("id_pais", new Integer(valor));  // ERRADO!!!

entendeu ?

abrassssss

Ivan_MV

Opa amigo, valeu pela ajuda.

Então não me preocupei com a parte de nomenclatura, pois eu peguei 2 exemplos e misturei.

Eu fiz o q vc falou mas mesmo assim não fncionou. Alterei o parametrode Integer para um objeto tipo Pais

query.setParameter("id_pais", pais);

Esse meu select está correto?

Abraço e obrigado…

renanreismartins

ah cara desculpa, seu atributo chama pais na classe Estado

entao deve ficar:

Query query = em.createQuery("SELECT m FROM Estado as m WHERE m.pais = :pais");

// e....

query.setParameter("pais", pais);

abrassss

Ivan_MV

Valeu amigo!!!.
Alterei o que falou e funcionou muito bem…

Abraço!!!

Criado 2 de outubro de 2009
Ultima resposta 2 de out. de 2009
Respostas 4
Participantes 2