Converter comando SQL para JPQL

3 respostas
M

Estou desenvolvendo uma aplicação com EclipseLink(JPA 2) e gostaria de sugestões de como converter um “comando” SQL para JPQL ou outra maneira de resolver isso.

o SQL:

INSERT INTO medicao(cod_medicao_referencia, cod_os, cod_mos_item, quantidade_total, valor_total)
(
SELECT mr.cod_medicao_referencia,
	os.cod_os, 
	ms.cod_mos_item, 
	sum(
		ms.medida1*COALESCE(ms.medida2,1)*COALESCE(ms.medida3,1)
	) AS quantidade_total,
	trunc(
		sum(
			(
				(CASE
					WHEN ms.pagar_mobra = true
					THEN mp.valor_mobra
					ELSE 0
				END)+
				(CASE
					WHEN ms.pagar_material= true
					THEN mp.valor_material
					ELSE 0
				END)
			)*(
				ms.medida1*COALESCE(ms.medida2,1)*COALESCE(ms.medida3,1)
			)
		),2
	) as valor_total
  FROM medicao_servicos ms
  INNER JOIN medicao_referencia mr 
	ON ms.cod_local=mr.cod_local
  INNER JOIN referencia r 
	ON mr.cod_referencia=r.cod_referencia
  INNER JOIN ordem_servico os 
	ON ms.cod_medicao_recurso=os.cod_medicao_recurso
  LEFT JOIN mos_preco mp 
	ON ms.cod_mos_item=mp.cod_mos
  WHERE  ms.data_pagamento BETWEEN mr.data_inicial AND mr.data_final 
	AND ms.cod_motivo_glosa IS NULL
	AND mr.cod_referencia = 1  
  GROUP BY ms.cod_mos_item,mr.cod_medicao_referencia,os.cod_os
  ORDER BY mr.cod_medicao_referencia,os.cod_os,ms.cod_mos_item
)

3 Respostas

V

Para fazer isso usando JPA, teria que criar uma nova entidade para cada registro que retornar do select e inserí-los um a um usando o persist ou merge.

Se você não tem um objeto que mapeia para o resultado do select, então pode criar um ou usar o resultado como uma lista de arrays (onde cada elemento do array é um valor de uma coluna do select). Poderia fazer algo como (não esqueça do controle de transação):

Query query = entityManager.createQuery({select aqui});
List<EntidadeResultadoSelect> resultadoSelect = query.getResultList();
for (EntidadeResultadoSelect entidade : resultadoSelect) {
   entityManager.persist(new EntidadeQueSeraSalva(entidade));
}

Mas eu acho que você não precisa fazer isso. Talvez possa usar os métodos createNativeQuery e executeUpdate da seguinte forma:

Query q = entityManager.createNativeQuery({sua query aqui});
int quantidadeDeRegistrosAtualizados = q.executeUpdate();
M

Acho q o createNativeQuery será a maneira mais fácil.

Mas em JPA como que posso fazer os CASE?

V

Se está usando JPA 2, então pode usar o CASE da nova versão do JPQL normalmente.
Dá uma olhada aqui: http://download.oracle.com/javaee/6/tutorial/doc/bnbuf.html#gjjnd

Mas se vai usar consultas nativas, não precisa traduzir nada para JPQL. Usa o SQL direto.

Criado 1 de fevereiro de 2011
Ultima resposta 2 de fev. de 2011
Respostas 3
Participantes 2