Recebo o valor perfeitamente. empresa.codEmpresa é do tipo int… no meu Banco de dados o campo correspondente é integer. Porem quando vou fazer a busca :
public List<VeiculosVendidosResumo> vendidosResumoEmpresa(Calendar data1, Calendar data2, int codEmpresa){
Query q = em
.createQuery("select NEW br.com.virage.ontranet.relatorios.VeiculosVendidosResumo(v.produto.descricao as produto,count(v.pk.chassiResumido) as qtde, sum(v.valorVenda) as valorVenda, sum(v.valorCustoFabrica) as valorCusto) from Veiculo v where v.status=:status and v.dataVenda>=:data1 and v.dataVenda<=:data2 and v.pk.codEmpresa=:codEmpresa group by v.produto.descricao");
q.setParameter("status", "V");
q.setParameter("data1", data1);
q.setParameter("data2", data2);
q.setParameter("codEmpresa", codEmpresa);
return q.getResultList();
}
recebo a seguinte exception:
se eu retirar o parametro codEmpresa funciona normalmente. Sei que é erro de tipo de dado… mas ja testei codEmpresa como int, Integer, Long… Ja testei recebendo o valor da pagina em uma variavel do tipo String e depois convertendo para int ou para long… e nao consegui soluçao. Olhei em varios tópicos semelhantes e nao consegui adequar a solução ao meu problema.
entao… meu Objeto empresa tem uma PK composta… pra isso eu criei uma classe:
@Embeddable
public class VeiculoPK implements Serializable{
@OneToOne
@JoinColumn(name="cod_empresa")
private Empresa codEmpresa;
@Column(name="chassi_resumido")
private String chassiResumido;
daí passei v.pk.codEmpresa como filtro… vou alterar pra testar.
sim ja tentei… coloquei até um sysout antes de tentar executar a jpql… chega o valor do codEmpresa… como Int… Long… empresa.getCOdEmpresa … mas todos dao o mesmo erro.
O problema está na chave composta.
Se a chave é um objeto, passar um int ou long não atende ao que é esperado.
Por isso eu corro de todo jeito de PK composta, acho que existem N outras maneiras de evitar isso e que são mais adequadas do ponto de vista da organização do sistema e das tabelas.
Ainda mais quando e vai usar um framework ORM.
Resolvido… e como o drsmachado disse… é uma chave composta… e um dos atributos é tipo empresa public class VeiculoPK implements Serializable{
@OneToOne
@JoinColumn(name="cod_empresa")
private Empresa codEmpresa; estava passando v.pk.id=empresa.getId() porem quando passei a enviar v.pk.id=empresa funcionou normalmente…
Eu definitivamente nao gosto de chaves compostas… mas estou desenvolvendo em cima de um banco já pronto e populado. Pelo menos aprendi pra nao passar com isso nas proximas classes (quase todas as tabelas do banco sao chave compostas).
Sei lá, tem DBA que é masoquista…
Atualmente mantenho um sistema legado, onde são realizados mais de 1 milhão de registros/dia e não á nenhuma PK composta.
cara… 80% das tabelas do banco que estou trabalhando tem PK composta…é bom pelo aprendizado, já que nunca tinha trabalhado a fundo com pk composta. Mas grande parte das PKs deste banco sao desnecessarias. Fazer o que né.