Hibernate, Criteria - Restrictions.between + Projections.groupProperty + DATA

6 respostas
R

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

6 Respostas

R

É, 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.

R

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.

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!

R

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

R

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

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.

J

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?

R

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.

Criado 26 de novembro de 2009
Ultima resposta 13 de ago. de 2010
Respostas 6
Participantes 4