Erro na Query

14 respostas
hugosg

Boa noite gente, estou com um erro que não resolvo de jeito nenhum:

@SuppressWarnings("unchecked") //warning query.list()
  public List<Fatura> calculaValorFatura(int idCliente, String dataInicio, String dataFim) {
    //Query query = session.createQuery("from Voucher where id_cliente = '"+idCliente+"' and dt_corrida between '"+dataInicio+"' and '"+dataFim+"'");
    Query query = session.createQuery("from voucher v, chamado c"+
                                      " where c.id_voucher = v.id_voucher"+
                                      " and c.id_cliente = v.id_cliente"+
                                      " and c.id_cliente = '"+idCliente+"'"+
                                      " and c.data_partida between '"+dataInicio+"' and '"+dataFim+"'"+
                                      " and upper(c.status) = 'CONCLUÍDO'"+
                                      " and upper(v.status) = 'REGISTRADO'");
    List<Fatura> faturas = query.list();
    return faturas;
  }

O erro é este:

Exception occurred during event dispatching:
org.hibernate.hql.ast.QuerySyntaxException: voucher is not mapped [from voucher v, chamado c where c.id_voucher = v.id_voucher and c.id_cliente = v.id_cliente and c.id_cliente = '2' and c.data_partida between 'Dia-Mês-Ano' and 'Dia-Mês-Ano' and upper(c.status) = 'CONCLUÍDO' and upper(v.status) = 'REGISTRADO']
        at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
        at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
        at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
        at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
        at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
        at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
        at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
        at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
        at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
        at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
        at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)

O erro aponta para mapeamento não encontrado das tabelas, só q só nesse caso, pois em outras consultas q não utiliza as duas tabelas juntas funciona tudo q é uma beleza, a diferença é só o uso do join. Qualquer coisa q puder me ajudar agradeço.

14 Respostas

zoren

O nome da classe é minusculo mesmo??

numa linha comentada vc usou com a primeira maiuscula

session.createQuery("from Voucher where id_cliente = '"+idCliente
Query query = session.createQuery("from voucher v, chamado c"+

não sei se vc percebeu, mas acho q no que funcionou vc escreveu com ‘V’ e no segundo vc escreveu com ‘v’

J

pelo que eu observei vc esta usando SQL em vez de HQL no seu query…

pra usar SQL puro, precisar fazer um createSQLQuery() em vez de createQuery() … mas isso não faria sentido se você tem as classes Voucher e Chamado mapeadas certinho…

hugosg

Eu escrevi as classes com letra maíuscula e o erro mudou, mas ainda é no mesmo lugar.

Exception occurred during event dispatching:
org.hibernate.QueryException: could not resolve property: id_voucher of: model.Chamado [from model.Voucher v, model.Chamado c where c.id_voucher = v.id_voucher and c.id_cliente = v.id_cliente and c.id_cliente = '2' and c.data_partida between '01-OUT-2009' and '31-OUT-2009' and upper(c.status) = 'CONCLUÍDO' and upper(v.status) = 'REGISTRADO']
        at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
        at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
        at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1358)
        at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:279)
        at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:386)
        at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:566)
        at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:241)
        at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:188)
        at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:94)
        at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:90)
        at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:728)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1216)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4041)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3525)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1762)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1687)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1687)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1687)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1687)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1687)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:776)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:577)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
        at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
        at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
        at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
        at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
        at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
        at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
        at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
L

Cara posta teus mapeamentos(Classes) e o cfg.xml pra gente ajudar.

Lavieri

Obs.: vc precisa falar qual vc quer, voucher ou chamado ??
trque ??? por algo como… "select v "

Query query = session.createQuery(" ????? from voucher v, chamado c"+ " where c.id_voucher = v.id_voucher"+ " and c.id_cliente = v.id_cliente"+ " and c.id_cliente = :id"+ " and c.data_partida between :inicio and :final"+ " and upper(c.status) = :cStatus"+ " and upper(v.status) = :vStatus") .setParameter("id",idCliente) .setParameter("inicio",dataInicio) .setParameter("final",dataFim) .setParameter("cStatus","CONCLUÍDO") .setParameter("vStatus","REGISTRADO");

hugosg

Coloquei o select v como o amigo ali sugeriu, até coloquei select c, mas deu na mesma.
Eis o mapemanto:

<?xml version="1.0" encoding="UTF-8" ?> 
  <!DOCTYPE hibernate-configuration (View Source for full doctype...)> 
- <hibernate-configuration>
- <session-factory>
  <property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property> 
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/taxi</property> 
  <property name="hibernate.connection.username">root</property> 
  <property name="hibernate.connection.password">root</property> 
- <!--  Show and print nice SQL on stdout 
  --> 
  <property name="show_sql">true</property> 
  <property name="format_sql">true</property> 
- <!--  List of annotated classes
  --> 
  <mapping package="taxi" /> 
  <mapping class="model.Cep" /> 
  <mapping package="taxi" /> 
  <mapping class="model.Chamado" /> 
  <mapping package="taxi" /> 
  <mapping class="model.Cliente" /> 
  <mapping package="taxi" /> 
  <mapping class="model.Cooperado" /> 
  <mapping package="taxi" /> 
  <mapping class="model.Fatura" /> 
  <mapping package="taxi" /> 
  <mapping class="model.Funcionario" /> 
  <mapping package="taxi" /> 
  <mapping class="model.Perfil" /> 
  <mapping package="taxi" /> 
  <mapping class="model.Salario" /> 
  <mapping package="taxi" /> 
  <mapping class="model.Usuario" /> 
  <mapping package="taxi" /> 
  <mapping class="model.Veiculo" /> 
  <mapping package="taxi" /> 
  <mapping class="model.Contato" /> 
  <mapping class="model.Voucher" /> 
  <mapping class="model.DebitoSalario" /> 
  </session-factory>
  </hibernate-configuration>
zoren

Coloca as classes Voucher e Chamado e a estrutura das tabelas do banco de dados

o hibernate está falando que ele não encontra a propriedade id_voucher, o nome é esse mesmo??

hugosg

Eis a classe em questão:

package model;

import java.io.Serializable;
import javax.persistence.*; //para as anotacoes

@Entity //anotacao indicando uma classe de entidade
@Table(name = "chamado") //cujos objetos serao armazenados nesta tabela
public class Chamado implements Serializable { //tem que ser serializavel
  @Id //indica campo identificador
  @GeneratedValue(strategy=GenerationType.IDENTITY) //valor gerado automaticamente
  @Column(name = "ID_CHAMADO") //coluna
  private int idChamado;
  @Column(name = "DATA_ABERTURA") //coluna
  private String dataAbertura;
  @Column(name = "HORA_ABERTURA") //coluna
  private String horaAbertura;
  @Column(name = "LOCAL_PARTIDA") //coluna
  private String localPartida;
  @Column(name = "DATA_PARTIDA") //coluna
  private String dataPartida;
  @Column(name = "HORA_EMBARQUE") //coluna
  private String horaEmbarque;
  @Column(name = "LOCAL_CHEGADA") //coluna
  private String localChegada;
  @Column(name = "HORA_DESEMBARQUE") //coluna
  private String horaDesembarque;
  @Column(name = "STATUS") //coluna
  private String status;
  @Column(name = "OBS") //coluna
  private String obs;
  @Column(name = "ID_CLIENTE") //coluna
  private int idCliente;
  @Column(name = "ID_COOPERADO") //coluna
  private int idCooperado;
  @Column(name = "ID_VOUCHER") //coluna
  private int idVoucher;
  @Column(name = "ID_FATURA") //coluna
  private int idFatura;
  @Column(name = "ID_SALARIO") //coluna
  private int idSalario;
  @Column(name = "VALOR_CORRIDA") //coluna
  private double valorCorrida;

Vou aproveitar e colocar o esquema que criou a tabela no banco.

CREATE TABLE `chamado` (
  `id_chamado` int(10) unsigned NOT NULL auto_increment,
  `data_abertura` varchar(11) NOT NULL,
  `hora_abertura` varchar(8) NOT NULL,
  `local_partida` varchar(100) NOT NULL,
  `data_partida` varchar(11) NOT NULL,
  `hora_embarque` varchar(8) default NULL,
  `local_chegada` varchar(100) NOT NULL,
  `hora_desembarque` varchar(8) default NULL,
  `status` varchar(20) NOT NULL,
  `obs` varchar(500) default NULL,
  `id_cliente` int(6) unsigned NOT NULL,
  `id_cooperado` int(6) unsigned NOT NULL,
  `id_fatura` int(6) unsigned default NULL,
  `id_salario` int(6) unsigned default NULL,
  `id_voucher` int(6) unsigned default NULL,
  `valor_corrida` double default NULL,
  PRIMARY KEY  (`id_chamado`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;

Espero que alguém possa resolver, rsrs.

zoren

Coloca a Voucher tbm

e geralmente, qdo a gente mapeia as classes e ela faz referencia a uma outra

a gente coloca a classe como um atributo da entidade e não um campo para representar o id da outra entidade

tipo naquele seu idVoucher que é int

geralmente seria

@ManyToOne
private Voucher voucher;

se vc não declarar os mapeamentos ele não consegue trazer os dados

hugosg
package model;

import java.io.Serializable;
import javax.persistence.*; //para as anotacoes

@Entity //anotacao indicando uma classe de entidade
@Table(name = "voucher") //cujos objetos serao armazenados nesta tabela
public class Voucher implements Serializable { //tem que ser serializavel
  @Id //indica campo identificador
  @GeneratedValue(strategy=GenerationType.IDENTITY) //valor gerado automaticamente
  @Column(name = "ID_VOUCHER") //coluna
  private int idVoucher;
  @Column(name = "TP_VOUCHER") //coluna
  private String tpVoucher;
  @Column(name = "STATUS") //coluna
  private String status;
  @Column(name = "DT_EMISSAO") //coluna
  private String dtEmissao;
  @Column(name = "DT_ENVIO") //coluna
  private String dtEnvio;
  @Column(name = "OBS") //coluna
  private String obs;
  @Column(name = "ID_CLIENTE") //coluna
  private int idCliente;
  @Column(name = "ID_COOPERADO") //coluna
  private int idCooperado;

No banco:

CREATE TABLE `voucher` (
  `id_voucher` int(6) unsigned NOT NULL auto_increment,
  `tp_voucher` varchar(6) NOT NULL,
  `status` varchar(20) NOT NULL,
  `dt_emissao` varchar(11) NOT NULL,
  `dt_envio` varchar(11) default NULL,
  `obs` varchar(500) default NULL,
  `id_cliente` int(6) unsigned default NULL,
  `id_cooperado` int(6) unsigned default NULL,
  PRIMARY KEY  (`id_voucher`)
) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
jidlafe

Cara me parece que o nome da entidade voucher não está mapeado, ou a tua instrução de consulta
está incorreta.

Dá uma olhada.

hugosg

Eu fiz como o outro amigo sugeriu:

@ManyToOne
  private Cliente cliente;
  @Column(name = "ID_COOPERADO") //coluna
  private int idCooperado;
  @ManyToOne
  private Voucher voucher;

A consulta ficou assim:

Query query = session.createQuery("from Voucher v, Chamado c"+
                                      " where c.voucher = v"+
                                      " and c.cliente = v.cliente"+
                                      " and c.cliente = '"+idCliente+"'"+
                                      " and c.data_partida between '"+dataInicio+"' and '"+dataFim+"'"+
                                      " and upper(c.status) = 'CONCLUÍDO'"+
                                      " and upper(v.status) = 'REGISTRADO'");
    List<Fatura> faturas = query.list();
    return faturas;

E o erro agora é este, mas não sei o que fazer com este campo já que ele não é chave estrangeira:

Exception occurred during event dispatching:
org.hibernate.QueryException: could not resolve property: data_partida of: model.Chamado [from model.Voucher v, model.Chamado c where c.voucher = v and c.cliente = v.cliente and c.cliente = '2' and c.data_partida between 'Dia-Mês-Ano' and 'Dia-Mês-Ano' and upper(c.status) = 'CONCLUÍDO' and upper(v.status) = 'REGISTRADO']
        at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
        at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
        at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1358)
        at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:279)
        at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:386)
        at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:566)
        at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:241)
        at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:188)
        at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:94)
        at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:90)
        at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:728)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1216)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4041)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3785)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1762)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1690)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1687)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1687)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:776)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:577)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
        at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
        at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
        at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
        at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
        at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
        at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
        at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
jidlafe

Cara é impressão minha ou você tem colunas em tuas tabelas com o nome separado
Tabela chamado.

J

tem duas coisas erradas ainda…

Query query = session.createQuery("from Voucher v, Chamado c"+ " where c.voucher = v"+ " and c.cliente = v.cliente"+ " and c.cliente = '"+idCliente+"'"+ " and c.data_partida between '"+dataInicio+"' and '"+dataFim+"'"+ " and upper(c.status) = 'CONCLUÍDO'"+ " and upper(v.status) = 'REGISTRADO'"); List<Fatura> faturas = query.list(); return faturas;

primeiro que as tuas variáveis dataInicio e dataFim não estão com datas formatadas… mas sim com o valor “dia/mes/ano”, coisa que o hibernate não consegue trabalhar…

segundo, você não pode declarar a lista de retorno como List pois em momento algum estais retornando Fatura… entenda… a lista do que vc retorna é sempre a classe que você mapeia após o "from " da tua consulta, no caso Voucher (ou Chamado) …

dei uma alterada no teu código e por cima ficaria mais ou menos assim:

Query query = session.createQuery("from Chamado c"+ " where c.cliente = '"+idCliente+"'"+ " and c.dataPartida between '"+dataInicio+"' and '"+dataFim+"'"+ " and upper(c.status) = 'CONCLUÍDO'"+ " and upper(c.voucher.status) = 'REGISTRADO'"); List<Chamado> chamados = query.list(); return faturas;

o ideal ainda é que você passe todos os parâmetros com o método setParameter, como exemplificado pelo Lavieri alguns posts acima…

Criado 14 de outubro de 2009
Ultima resposta 15 de out. de 2009
Respostas 14
Participantes 6