Java.lang.IllegalArgumentException em JPQL [RESOLVIDO]

8 respostas
N
Olá. tenho um selectOneMenu que popula normalmente:
<p:selectOneMenu value="#{veiculosVendidosResumoBean.empresa.codEmpresa}">
							
							<f:selectItems value="#{veiculosVendidosResumoBean.empresas}"
								var="e" itemValue="#{e.codEmpresa}" itemLabel="#{e.nome}" />
						</p:selectOneMenu>

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:
Caused by: java.lang.IllegalArgumentException: Parameter value [9] was not matching type [br.com.virage.intranet.modelo.Empresa]

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.

Alguma sugestão? Desde já agradeço.

8 Respostas

drsmachado

Você entende que a mensagem de erro diz que o atributo codEmpresa deve ser um objeto de Empresa?

N

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.

ManoJava

Já tentou passar como parametro um empresa.getCodEmpresa() ?

N

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.

drsmachado

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.

N

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).

drsmachado

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.

N

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é.

Criado 4 de agosto de 2013
Ultima resposta 5 de ago. de 2013
Respostas 8
Participantes 3