Olá pessoal,
Estou tomando uma surra aqui com uma criteria:
Session sessao = HibernateUtil.getInstance().getSession();
Criteria criteria = sessao.createCriteria(Lote.class, "lote");
criteria.add(Restrictions.between("lote.dtEncaminha", dtInicial, dtFinal));
criteria.setProjection(Projections.groupProperty("lote.dtEncaminha"));
criteria.createAlias("creditos", "creditos");
criteria.createAlias("creditos.situacoes", "situacoes");
Disjunction disjunction = Restrictions.disjunction();
for (SituacaoCreditoPublicoOrigemExterna situacao : situacoes) {
disjunction.add(Restrictions.eq("situacoes.id", situacao.getId()));
}
criteria.add(disjunction);
criteria.addOrder(Order.asc("lote.dtEncaminha"));
return criteria.list();
Usando Restrictions.between + Projections.groupProperty + DATA=como um período dá ERRO:
[color=darkred]java.lang.ClassCastException: java.sql.Timestamp cannot be cast to teste.bean.Lote[/color]
Quando uso:
Session sessao = HibernateUtil.getInstance().getSession();
Criteria criteria = sessao.createCriteria(Lote.class, "lote");
criteria.add(Restrictions.eq("lote.dtEncaminha", dtEncaminha));
criteria.setProjection(Projections.groupProperty("lote.dtEncaminha"));
criteria.createAlias("creditos", "creditos");
criteria.createAlias("creditos.situacoes", "situacoes");
Disjunction disjunction = Restrictions.disjunction();
for (SituacaoCreditoPublicoOrigemExterna situacao : situacoes) {
disjunction.add(Restrictions.eq("situacoes.id", situacao.getId()));
}
criteria.add(disjunction);
criteria.addOrder(Order.asc("lote.dtEncaminha"));
return criteria.list();
Funciona! Até mesmo o Between se eu usar uma mesma data ele funciona estranhamente!
Não entendo
É, assim n tou vendo nada de errado a primeira vista não…
Agora faz o seguinte, onte tem lote.dtEncaminha coloca só dtEncaminha, quando
está trabalhando restrições para a classe Lote.class não precisa colocar o alias.
[quote=RicardoCobain]É, assim n tou vendo nada de errado a primeira vista não…
Agora faz o seguinte, onte tem lote.dtEncaminha coloca só dtEncaminha, quando
está trabalhando restrições para a classe Lote.class não precisa colocar o alias.[/quote]
Fala Ricardo,
Valeu mesmo pela dica… sobre o problema aparentemente está tudo bem mas não sei o que acontece que não funciona muito bem GROUP BY DATA e BETWEEN DATA
Uma restrição normal funciona, quando coloco o BETWEEN baba tudo!
Cara, bota o hibernate.show.sql como true no arquivo de configuração e da uma olhada como o SQL tá sendo gerado.
Qual é o tipo de dtEncaminha ? java.util.Date ? Se não for coloca, e no banco vc coloca
date ou timestamp (data e hora).
[quote=RicardoCobain]Cara, bota o hibernate.show.sql como true no arquivo de configuração e da uma olhada como o SQL tá sendo gerado.
Qual é o tipo de dtEncaminha ? java.util.Date ? Se não for coloca, e no banco vc coloca
date ou timestamp (data e hora).[/quote]
Fala Ricardo,
O pior é que a dtEncaminha já está java.util.Date e no banco oracle é date tb.
Tó quase construindo um HQL e esquecendo o CRITERIA e partindo para transformar a data em String formatada para consulta. Já não estou com muito tempo pra gastar nisso!
Sinistro, erro mais louco! Ora funciona ora não.
Olá, eu sei bem pouca coisa de JAVA e muito menos de Hibernate, mas qual seria a diferença entre você utilizar Expression.Between e Restrictions.Between?
Já utilizei algo parecido com isso: criteria.add(Restrictions.between("lote.dtEncaminha", dtInicial, dtFinal));
Vc precisa que esses três campos sejam do tipo java.util.Date.
Como vc setou as colunas datas no banco? Que tipo são Date, DateTime, TimeStamp?
Se for por exemplo DateTime, o seu mapeamento deve ser TimeStamp, embora seu private seja Date.