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

Dúvida no Ex. 7 da Aula 5 - Pesquisas orientado a objetos com JPQL

Está aparecendo um erro na hora da consulta:

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: conta of: br.com.caelum.financas.modelo.Movimentacao [select m from br.com.caelum.financas.modelo.Movimentacao m where m.conta.id=1]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1374)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294)
    at br.com.caelum.financas.teste.TestaFinancas.main(TestaFinancas.java:20)
Caused by: org.hibernate.QueryException: could not resolve property: conta of: br.com.caelum.financas.modelo.Movimentacao [select m from br.com.caelum.financas.modelo.Movimentacao m where m.conta.id=1]
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77)
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1968)
    at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:313)
    at org.hibernate.hql.internal.ast.tree.FromElement.getPropertyType(FromElement.java:494)
    at org.hibernate.hql.internal.ast.tree.DotNode.getDataType(DotNode.java:598)
    at org.hibernate.hql.internal.ast.tree.DotNode.prepareLhs(DotNode.java:266)
    at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:213)
    at org.hibernate.hql.internal.ast.tree.DotNode.resolveFirstChild(DotNode.java:177)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:577)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4719)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1260)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4426)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3898)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2076)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:794)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:595)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1777)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291)
    ... 1 more

Classe de testes finanças:

package br.com.caelum.financas.teste;

import java.util.List;

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

import br.com.caelum.financas.modelo.Conta;
import br.com.caelum.financas.modelo.Movimentacao;
import br.com.caelum.financas.util.JPAUtil;

public class TestaFinancas {

    public static void main(String[] args) {
        EntityManager manager = new JPAUtil().getEntityManager();

        Conta conta = new Conta();
        conta.setId(1);

        Query query = manager.createQuery("select m from Movimentacao m where m.conta.id=" + conta.getId());

        List<Movimentacao> movimentacao = query.getResultList();
        for (Movimentacao m : movimentacao) {
            System.out.println("\nDescricao: " + m.getDescricao());
            System.out.println("Valor: " + m.getValorMovimentado());
        }

        manager.close();
    }

}
9 respostas

Poste as classes conta e movimentacao.

Como declarou o atributo conta dentro da clase movimentacao ?

package br.com.caelum.financas.modelo;

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

@Entity
public class Conta {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String titular;
    private String banco;
    private String agencia;
    private String numero;

    public Integer getId() {
        return id;
    }

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

    public String getTitular() {
        return titular;
    }

    public void setTitular(String titular) {
        this.titular = titular;
    }

    public String getBanco() {
        return banco;
    }

    public void setBanco(String banco) {
        this.banco = banco;
    }

    public String getAgencia() {
        return agencia;
    }

    public void setAgencia(String agencia) {
        this.agencia = agencia;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }
}


package br.com.caelum.financas.modelo;

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

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.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Movimentacao {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer Id;
    private BigDecimal valorMovimentado;
    @Enumerated(EnumType.STRING)
    private TipoMovimentacao tipoMovimentacao;
    @Temporal(TemporalType.DATE)
    private Calendar data;
    private String descricao;

    @ManyToOne
    private Conta contaVinculada;

    public Integer getId() {
        return Id;
    }

    public void setId(Integer id) {
        Id = id;
    }

    public BigDecimal getValorMovimentado() {
        return valorMovimentado;
    }

    public void setValorMovimentado(BigDecimal valorMovimentado) {
        this.valorMovimentado = valorMovimentado;
    }

    public TipoMovimentacao getTipoMovimentacao() {
        return tipoMovimentacao;
    }

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

    public Calendar getData() {
        return data;
    }

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

    public String getDescricao() {
        return descricao;
    }

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

    public Conta getContaVinculada() {
        return contaVinculada;
    }

    public void setContaVinculada(Conta contaVinculada) {
        this.contaVinculada = contaVinculada;
    }

}

Beleza, da um tempinho ai eu ja verifico para você e te dou um retorno

A principio veja se resolve dessa forma, adicione mais uma anotação em cima do atributo Conta:

@ManyToOne
@JoinColumn(name = "idconta", referencedColumnName="id")
private Conta idconta;

Essa anotação do @JoinColumn informa como o hibernate deve fazer a amarração das tabelas, qual são as FKs e PKs vinculadas de uma tabela A para uma tabela B.

Ai sua tabela Movimentacao no banco de dados deve ter esse campo idconta como uma FK(Foreign Key) para o id da tabela Conta.

idconta integer;

alter table movimentacao add constraint foreign key(idconta) references conta(id);

Não sei como estão suas tabelas, mas a idéia é mais ou menos essa ai.

Aparentemente deu certo, não foi retornado nenhum erro.

Veja só como está o banco:

mysql> select * from Conta;
+----+---------+-------------------------------+---------+---------------------+
| id | agencia | banco                         | numero  | titular             |
+----+---------+-------------------------------+---------+---------------------+
|  1 | 6543    | 001 - BANCO DO BRASIL         | 16987-8 | Maria dos Santos    |
|  2 | 1745    | 237 - BANCO BRADESCO          | 86759-1 | Paulo Roberto Souza |
|  3 | 4606    | 341 - BANCO ITAU UNIBANCO     | 46346-3 | Antonio Duraes      |
|  4 | 9876    | 033 - BANCO SANTANDER         | 12345-6 | Leandra Marques     |
|  5 | 1234    | 104 - CAIXA ECONOMICA FEDERAL | 98654-3 | Alexandre Duarte    |
+----+---------+-------------------------------+---------+---------------------+
5 rows in set (0,00 sec)


mysql> mysql> select * from Movimentacao;
+----+------------+-------------------------------------+------------------+------------------+-------------------+---------+
| Id | data       | descricao                           | tipoMovimentacao | valorMovimentado | contaVinculada_id | idconta |
+----+------------+-------------------------------------+------------------+------------------+-------------------+---------+
|  1 | 2016-02-03 | Conta de luz - ABRIL/2012           | SAIDA            |           135.00 |                 1 |    NULL |
|  2 | 2016-02-03 | Almoco no Restaurante - AGOSTO/2012 | SAIDA            |           175.80 |                 1 |    NULL |
|  3 | 2016-02-03 | Aluguel - MAIO/2012                 | ENTRADA          |           680.00 |                 1 |    NULL |
|  4 | 2016-02-03 | Salario - FEVEREIRO/2012            | ENTRADA          |          3830.68 |                 1 |    NULL |
|  5 | 2016-02-03 | Conta de telefone - SETEMBRO/2011   | SAIDA            |           168.27 |                 2 |    NULL |
|  6 | 2016-02-03 | Aniversario - MAIO/2011             | ENTRADA          |           200.00 |                 2 |    NULL |
|  7 | 2016-02-03 | Lanche - JULHO/2011                 | SAIDA            |            28.50 |                 3 |    NULL |
|  8 | 2016-02-03 | Presente - DEZEMBRO/2011            | SAIDA            |            49.99 |                 3 |    NULL |
|  9 | 2016-02-03 | Bonus - JANEIRO/2012                | ENTRADA          |          2000.00 |                 3 |    NULL |
| 10 | 2016-02-03 | Carnaval - MARCO/2012               | SAIDA            |           765.20 |                 4 |    NULL |
| 11 | 2016-02-03 | Salario - ABRIL/2012                | ENTRADA          |          2651.90 |                 5 |    NULL |
| 12 | 2016-02-03 | Bonus - JANEIRO/2012                | ENTRADA          |          1000.00 |                 5 |    NULL |
| 13 | 2016-02-04 | Conta de luz - ABRIL/2012           | SAIDA            |           135.00 |              NULL |       1 |
| 14 | 2016-02-04 | Almoco no Restaurante - AGOSTO/2012 | SAIDA            |           175.80 |              NULL |       1 |
| 15 | 2016-02-04 | Aluguel - MAIO/2012                 | ENTRADA          |           680.00 |              NULL |       1 |
| 16 | 2016-02-04 | Salario - FEVEREIRO/2012            | ENTRADA          |          3830.68 |              NULL |       1 |
| 17 | 2016-02-04 | Conta de telefone - SETEMBRO/2011   | SAIDA            |           168.27 |              NULL |       2 |
| 18 | 2016-02-04 | Aniversario - MAIO/2011             | ENTRADA          |           200.00 |              NULL |       2 |
| 19 | 2016-02-04 | Lanche - JULHO/2011                 | SAIDA            |            28.50 |              NULL |       3 |
| 20 | 2016-02-04 | Presente - DEZEMBRO/2011            | SAIDA            |            49.99 |              NULL |       3 |
| 21 | 2016-02-04 | Bonus - JANEIRO/2012                | ENTRADA          |          2000.00 |              NULL |       3 |
| 22 | 2016-02-04 | Carnaval - MARCO/2012               | SAIDA            |           765.20 |              NULL |       4 |
| 23 | 2016-02-04 | Salario - ABRIL/2012                | ENTRADA          |          2651.90 |              NULL |       5 |
| 24 | 2016-02-04 | Bonus - JANEIRO/2012                | ENTRADA          |          1000.00 |              NULL |       5 |
+----+------------+-------------------------------------+------------------+------------------+-------------------+---------+
24 rows in set (0,00 sec)

Me parece que ele duplicou as movimentações e populou contaVinculada_id com NULL

Esse campo idconta dentro da tabela movimentacao deve estar apontando para algum id de suas contas.

Como esta a estrutura das tabelas ?, você criou a FK de idconta dentro da tabela movimentacao ?, como esta a sua SQL ?

Veja no consola a SQL que o Hibernate gerou, vamos ver como foi feito a amarração das tabelas

Eu executei a classe de teste errada, após executar a correta que é TestaFinancas apareceu o seguinte erro:

INFO: HHH000232: Schema update complete
Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: conta of: br.com.caelum.financas.modelo.Movimentacao [select m from br.com.caelum.financas.modelo.Movimentacao m where m.conta.id=1]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1374)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294)
    at br.com.caelum.financas.teste.TestaFinancas.main(TestaFinancas.java:20)
Caused by: org.hibernate.QueryException: could not resolve property: conta of: br.com.caelum.financas.modelo.Movimentacao [select m from br.com.caelum.financas.modelo.Movimentacao m where m.conta.id=1]
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77)
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1968)
    at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:313)
    at org.hibernate.hql.internal.ast.tree.FromElement.getPropertyType(FromElement.java:494)
    at org.hibernate.hql.internal.ast.tree.DotNode.getDataType(DotNode.java:598)
    at org.hibernate.hql.internal.ast.tree.DotNode.prepareLhs(DotNode.java:266)
    at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:213)
    at org.hibernate.hql.internal.ast.tree.DotNode.resolveFirstChild(DotNode.java:177)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:577)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4719)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1260)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4426)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3898)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2076)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:794)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:595)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1777)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291)
    ... 1 more

O banco esta como informado no post anterior

Não era pra eu ter clicado nesse botão de solução, culpa do touchpad que situação chata...

solução!

Vou refazer o projeto, devo ter deixado algo passar. Caso a dúvida continue abro outra discussão.

Obrigado Mateus.