JPA com query Nativa

Amigos,

estou querendo executar um query nativa usando EntityManager do JPA mas esta dando erro,

essa query deve retornar apenas uma linha de resultado

			EntityManager em = new UtilFactoryDAO().getEntityManagerConection();
			String sqlQuery = "SELECT NVL(SUM(r.vlrCliente),0),\n" +
			"       NVL(SUM(r.vlrEmpresa),0) \n" + 
			"  FROM ClienteTO r\n" + 
			"   WHERE r.dataMovimento = :dataMovimento";
			Query q = em.createQuery(sqlQuery, ClienteTO.class);
			q.setParameter("dataMovimento", dataMovimento);
			clienteTO = (ClienteTO) q.getSingleResult();

E qual o erro que dá?

esta dando erro nesta linha clienteTO = (ClienteTO) q.getSingleResult();


12:12:09,002 ERROR [stderr] (http--127.0.0.1-8089-1) java.lang.ClassCastException: java.lang.Double cannot be cast to br.com.projetoCliente.relatorios.to.ClienteTO

Olha a mensagem de erro:

De onde você tirou que está retornando mais de um resultado? Seu problema é de java mesmo, e não JPA.

Quando eu digo que irá retornar uma linha de resultado e porque eu executei a query direto no banco,

eu percebi que o problema e no Cast, mas se eu tiro esse Cast ai ele pedi para eu declarar meu ClienteTO como Object

na linha clienteTO = (ClienteTO) q.getSingleResult(); ao invés de retornar o valor esta retornando um Object

como eu posso converter isso ?

O resultado da sua query é um numeral Double e não um objeto ClienteTO. Por isso dá erro quando tenta converter de Double para ClienteTO.

O que eu devo fazer para retornar um ClienteTO ?

Minha query esta assim

SELECT NVL(SUM(valor),0),
       NVL(SUM(valor_1),0),
       NVL(SUM(valor_2),0),
       NVL(SUM(valor_3),0),
       NVL(SUM(valor_4),0),
       NVL(SUM(valor_4),0)
  FROM CLIENTES 
 WHERE DATA_MOVIMENTO = '20131128'

nela retorna 1 linha com 5 colunas com os valores

Sua query é a que foi postada no primeiro tópico né? Sabe que não é uma SQL query nativa, está usando JPQL.

Quando você busca por atributos específicos, ele não te retorna o objeto, te retorna um array de Object.

Dê uma olhada neste post - http://blog.caelum.com.br/jpa-com-hibernate-heranca-e-mapeamentos - você precisa mapear os atributos, criando um construtor na classe recebendo como parâmetro os mesmos atributos que está buscando.

[quote=thiagoRibeiro]O que eu devo fazer para retornar um ClienteTO ?

Minha query esta assim

SELECT NVL(SUM(valor),0),
       NVL(SUM(valor_1),0),
       NVL(SUM(valor_2),0),
       NVL(SUM(valor_3),0),
       NVL(SUM(valor_4),0),
       NVL(SUM(valor_4),0)
  FROM CLIENTES 
 WHERE DATA_MOVIMENTO = '20131128'

nela retorna 1 linha com 5 colunas com os valores [/quote]Olhe aqui: http://uaihebert.com/jpa-consultas-e-dicas/9/

Repare no blog do Hebert que pra usar sql mesmo você deveria chamar o método em.createNativeQuery.

Hebert,

estou seguindo o link que vc me passou que por sinal é muito bom mas estou tendo o erro de que a tabela não existe

mas esta mapeado meu ClienteTO, inclusive comentei a consulta que estou querendo fazer e estou executando uma outra consulta com a mesma Entidade mapeada e esta funcionando

segue como implementei

			EntityManager em = new UtilFactoryDAO().getEntityManagerConection();
	        Query query = em.createNativeQuery("SELECT SUM(r.valor),SUM(r.valor1) FROM ClienteTO r " +
	        		"where r.dataMovimento = :dataMovimento ", ClienteTO.RESULT_AMOUNT);
			query.setParameter("dataMovimento", dataMovimento);
	        Object[] result = (Object[]) query.getSingleResult();
	        clienteTO = (ClienteTO) result[0];
	        BigInteger total = (BigInteger) result[1];

Meu ClienteTO


@Entity
@SqlResultSetMapping(name = "ClienteTO ", entities = { @EntityResult(entityClass = br.com.zeus.relatorios.to.ClienteTO .class) }, columns = {
		@ColumnResult(name = "valor"),
		@ColumnResult(name = "valor1") })

public static final String RESULT_AMOUNT = "ClienteTO";

Hebert,

consegui resolver, troquei o createNativeQuery por createQuery e parou de dar o erro de tabela ou View não existe,

alguém sabe me responder porque não estava encontrando minha entidade quando estava usando o createNativeQuery ?

e o valores segui conforme sua orientação e funcionou perfeitamente, abaixo esta como ficou

Muito Obrigado

Double total = (Double) result[0];
Double total1 = (Double) result[1];
			EntityManager em = new UtilFactoryDAO().getEntityManagerConection();
	        Query query = em.createNativeQuery("SELECT SUM(r.valor),SUM(r.valor1) FROM ClienteTO r " +
	        		"where r.dataMovimento = :dataMovimento ", ClienteTO.RESULT_AMOUNT);
			query.setParameter("dataMovimento", dataMovimento);
	        Object[] result = (Object[]) query.getSingleResult();
	       
	        Double total = (Double) result[0];
                Double total1 = (Double) result[1];
	

[quote=thiagoRibeiro]Amigos,

estou querendo executar um query nativa usando EntityManager do JPA mas esta dando erro,

essa query deve retornar apenas uma linha de resultado

EntityManager em = new UtilFactoryDAO().getEntityManagerConection(); String sqlQuery = "SELECT NVL(SUM(r.vlrCliente),0),\n" + " NVL(SUM(r.vlrEmpresa),0) \n" + " FROM ClienteTO r\n" + " WHERE r.dataMovimento = :dataMovimento"; Query q = em.createQuery(sqlQuery, ClienteTO.class); q.setParameter("dataMovimento", dataMovimento); clienteTO = (ClienteTO) q.getSingleResult(); [/quote]