Estou fazendo uma pesquisa usando JPA por intervalo de datas e gostaria de saber se a sintaxe da query a seguir está correta.
public Collection<BugTO> indicadorImprocedenciaOcorrencias(Date inicio,Date fim) {
StringBuilder sql = new StringBuilder("SELECT t ");
sql.append(recuperarNomeEntidade());
sql.append(" t WHERE to_char(t.bgDetectionDateInterval, 'yyyy/mm/dd') >= '"+ inicio + "' and to_char(t.bgDetectionDateInterval, 'yyyy/mm/dd') <= '"+ fim +"'");
Query query = getEntityManager().createQuery(sql.toString());
query.setParameter("bgDetectionDateInterval", inicio);
query.setParameter("bgDetectionDateInterval", fim);
return query.getResultList();
}
A Query original e essa
select * from TEST_TELESP@BDQUALITY
WHERE to_char(TS_CREATION_DATE, 'yyyy/mm/dd') >= '2009/05/01' and to_char(TS_CREATION_DATE, 'yyyy/mm/dd') <= '2009/05/30'
sql.append(" t WHERE to_char(t.bgDetectionDateInterval, 'yyyy/mm/dd') >= '"+ inicio + "' and to_char(t.bgDetectionDateInterval, 'yyyy/mm/dd') <= '"+ fim +"'");
No projeto que vc ta fazendo, nao tem possibilidade de usar criteria do hibernate ?
pq era so colocar restriction.between(data1,data2);
public Collection<BugTO> indicadorImprocedenciaOcorrencias(Date inicio,Date fim) {
StringBuilder sql = new StringBuilder("SELECT t ");
sql.append(recuperarNomeEntidade());
sql.append(" t WHERE to_char(t.bgDetectionDateInterval, 'yyyy/mm/dd') between '"+ inicio + "' and '"+ fim +"'");
Query query = getEntityManager().createQuery(sql.toString());
query.setParameter("bgDetectionDateInterval", inicio);
query.setParameter("bgDetectionDateInterval", fim);
return query.getResultList();
}
public List<Classe> getValorEntreDatas(Date data1,Date data2){
EntityManager em = PersistenceUtil.getEntityManager();
Query query = em.createQuery("from Classe as o where data between :data1 and :data2");
query.setParameter("data1 ", data1 );
query.setParameter("data2", data2);
return (List<Classe>)query.getResultList();
}
eu peguei o que vc mandou e adpatei no que tenho mais não deu certo estou fazendo algo errado ?
public Collection<BugTO> indicadorImprocedenciaOcorrencias(Date data1,Date data2){
StringBuilder sql = new StringBuilder("SELECT t ");
sql.append(recuperarNomeEntidade());
Query query = getEntityManager().createQuery("from where data between :data1 and :data2");
query.setParameter("data1 ", data1 );
query.setParameter("data2", data2);
return (Collection<BugTO>)query.getResultList();
}
alterei essa linha
EntityManager em = PersistenceUtil.getEntityManager(); devido o PersistenceUtil esta gerando erro e deixei como esta acima
a exceção gerada foi essa
13:57:59,263 ERROR [PARSER] line 1:6: unexpected token: where
13:58:02,779 ERROR [STDERR] javax.ejb.EJBTransactionRolledbackException: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: where near line 1, column 6 [from where data between :data1 and :data2]
e verdade eu percebi o erro do nome da coluna e concertei antes de vc responder novamente, mais agora fiz corretamente mais ainda não funcinou
public Collection<BugTO> indicadorImprocedenciaOcorrencias(Date data1,Date data2){
Query query = getEntityManager().createQuery(" from b where b.TS_CREATION_DATE between :data1 and :data2");
query.setParameter("data1 ", data1 );
query.setParameter("data2", data2);
return (Collection<BugTO>)query.getResultList();
}
gera a exceção
14:30:00,670 ERROR [STDERR] javax.ejb.EJBTransactionRolledbackException: org.hibernate.hql.ast.QuerySyntaxException: b is not mapped [ from b where b.TS_CREATION_DATE between :data1 and :data2]
Se eu coloco o nome real da tabela sem apelidar gera essa exceção
14:34:40,388 ERROR [STDERR] javax.ejb.EJBTransactionRolledbackException: org.hibernate.QueryException: unexpected char: '@' [ from TEST_TELESP@BDQUALITY where TEST_TELESP@BDQUALITY.TS_CREATION_DATE between :data1 and :data2]
esses sao os 2 tipos que conhece para fazer query com parametros via jpa:
sem ser nativa
Query query = em.createQuery("SELECT p FROM Product p WHERE p.param2 < :threshold ORDER BY p.param1 ascending");
query.setParameter("threshold", my_threshold);
List results = query.getResultList();
e nativa
Query query = em.createNativeQuery("SELECT * FROM Product p WHERE p.param2 < ?1");
query.setParameter(1, my_threshold);
List results = query.getResultList();
Cherubini em fim deu certo esta aqui o metodo final correto
valeu pela força Cherubini
public Collection<BugTO> indicadorImprocedenciaOcorrencias(Date inicio, Date fim){
Query query = getEntityManager().createQuery(" from BugTO where bgDetectionDate between :inicio and :fim");
query.setParameter("inicio", inicio);
query.setParameter("fim", fim);
return query.getResultList();
}