Java.lang.IllegalArgumentException em JPQL [RESOLVIDO]

Olá. tenho um selectOneMenu que popula normalmente:

[code]<p:selectOneMenu value="#{veiculosVendidosResumoBean.empresa.codEmpresa}">

						<f:selectItems value="#{veiculosVendidosResumoBean.empresas}"
							var="e" itemValue="#{e.codEmpresa}" itemLabel="#{e.nome}" />
					</p:selectOneMenu>[/code]

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.

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

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

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.

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

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