Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

could not resolve property: categorias of: br.com.dirley.financas.modelo.Categoria

package br.com.dirley.financas.teste;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.dirley.financas.modelo.Movimentacao;
import br.com.dirley.financas.modelo.Categoria;
import br.com.dirley.financas.util.JPAUtil;

public class TesteJPQLMovCat {
    public static void main(String[] args) {
        EntityManager em = new JPAUtil().getEntityManager();
        em.getTransaction().begin();

        @SuppressWarnings("deprecation")
        Categoria categoria = new Categoria();
        categoria.setId(1);

        String jpql = "select m from Movimentacao m join m.categorias c where c.categorias = :pCategoria";
        Query query = em.createQuery(jpql);
        query.setParameter("pCategoria", categoria);

        @SuppressWarnings("unchecked")
        List<Movimentacao> resultados = query.getResultList();

        for (Movimentacao movimentacao : resultados) {
            System.out.println("Descrição: "+movimentacao.getDescricao());
            System.out.println("Conta: "+movimentacao.getConta().getTitular());

        }

        em.getTransaction().commit();
        em.close();
    }
}
package br.com.dirley.financas.modelo;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.dirley.financas.util.TipoMovimentacao;

@Entity
public class Movimentacao {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private BigDecimal valor;

    @Enumerated(EnumType.STRING)
    private TipoMovimentacao tipo;

    private String descricao;

    @Temporal(TemporalType.TIMESTAMP)
    private Calendar data;

    @ManyToOne
    private Conta conta;

    @ManyToMany
    private List<Categoria> categorias;

    public List<Categoria> getCategorias() {
        return categorias;
    }

    public void setCategorias(List<Categoria> categorias) {
        this.categorias = categorias;
    }

    public Integer getId() {
        return id;
    }

    public BigDecimal getValor() {
        return valor;
    }

    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }

    public TipoMovimentacao getTipo() {
        return tipo;
    }

    public void setTipo(TipoMovimentacao tipo) {
        this.tipo = tipo;
    }

    public String getDescricao() {
        return descricao;
    }

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

    public Calendar getData() {
        return data;
    }

    public void setData(Calendar data) {
        this.data = data;
    }

    public Conta getConta() {
        return conta;
    }

    public void setConta(Conta conta) {
        this.conta = conta;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

package br.com.dirley.financas.modelo;

import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id;

@Entity public class Categoria {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String nome;

@Deprecated
public Categoria() {
}
public Categoria(String nome) {
    this.nome = nome;
}
public Integer getId() {
    return id;
}
public void setId(Integer id) {
    this.id = id;
}
public String getNome() {
    return nome;
}
public void setNome(String nome) {
    this.nome = nome;
}

}

Não consigo encontrar onde está errado. Pode me ajudar? ` Segue o erro: Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: categorias of: br.com.dirley.financas.modelo.Categoria [select m from br.com.dirley.financas.modelo.Movimentacao m join m.categorias c where c.categorias = :pCategoria] br.com.dirley.financas.teste.TesteJPQLMovCat.main(TesteJPQLMovCat.java:22) Caused by: org.hibernate.QueryException: could not resolve property: categorias of: br.com.dirley.financas.modelo.Categoria [select m from br.com.dirley.financas.modelo.Movimentacao m join m.categorias c where c.categorias = :pCategoria]

2 respostas
solução!

Olá Dirley, tudo bem?

Pelo seu JPQL, você está tentando acessar a propriedade "categorias" da entidade "Categoria", no qual realmente não existe (você só tem as propriedades "id" e "nome"). Veja:

select m from br.com.dirley.financas.modelo.Movimentacao m join m.categorias c where c.categorias = :pCategoria

Pelo o que entendi da sua lógica, você quer obter movimentações que tenham a categoria informada no filtro. Portanto, acho que o seu comando poderia ficar assim:

select m from br.com.dirley.financas.modelo.Movimentacao m join m.categorias c where c = :pCategoria

Abraços

Renato, bom dia.

Obrigado. Deve ter sido o sono porque eu olhei esse código 300 vezes eu não vi esse detalhe.