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();
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]