JPA - Consulta por intervalo de datas

16 respostas
R

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'

16 Respostas

C

Fala robson,

entao cara, primeiro se vc ta dando:

query.setParameter("bgDetectionDateInterval", inicio);

pq ta concatenando os resultados na query?

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

e pronto.

bom qualquer coisa é so falar.

abraços

R

Cherubini não posso usar Hibernate

eu concatenei mais para testar mais não deu certo e a primeira vez que uso JPA então não sei se poderia usar dessa forma minha query

qual a outra forma que eu poderia usar ?

W

Pq vc não usa o between do SQL???

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

C

Bom, faz assim entao:

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

}
R

Cherubini

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]
C

amigo,

aqui ta errado, olha:

Query query = getEntityManager().createQuery("from where data between :data1 and :data2");

primeiro from vc tem q colocar o nome da tabela e o campo chama data msm ?

abraços

C

vc tbm nao precisa + disso:

StringBuilder sql = new StringBuilder("SELECT t ");   
       sql.append(recuperarNomeEntidade());
R

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]
C

vamos lá:

primeiro

cola ai, sua classe mapeada pelo jpa, para ver como ela esta

segundo

quando vc colocou o nome da classe vc fez assim neh

Query query = getEntityManager().createQuery(" from BugTO where TS_CREATION_DATE between :data1 and :data2");

abraço

R

Cherubini acho que agora foi mais deu problema nos parametros que estou passando…

não são os parametros que vem da query “data1” e “data2” que preciso setar ?

query.setParameter("data1 ", data1 );     
query.setParameter("data2", data2);
C

esse data1 e data2 vem como parametro no seu metodo!

C

bom robson,

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

Abraços

R

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();  
		   
		 }
C

Aee Robson!

Daora cara!

De nada,quem sabe uma hora é vc que vai me ajudar!

flws

A

hjkhk

L

olá senhores, saudações

tenho um grandisimo problema

tenho q passar uma data por parametro e comprar se ela se encontra num intervalo de datas dentro do banco de dados

se ajudar envio o codigo errado pra ver quem pode dar uma força

desde já fico grato
[/code]
public boolean consultaReserva(String item, Date campoData){
boolean achou;
Session ses = getSession();
Query query = ses.createQuery("from ItemsAcervo itens where itens.itememp = :it and "+campoData+"between itens.dataEmprestimo and itens.dataDevolucao)");
query.setString("it", item);
ItemsAcervo itens = (ItemsAcervo) query.uniqueResult();
achou = (itens != null);
session.getTransaction().commit();
session.close();
return achou;
}[code]

Criado 5 de agosto de 2009
Ultima resposta 21 de out. de 2009
Respostas 16
Participantes 5