BUsca entre Data Não Retorna Nada! (RESOLVIDO)

Estou tentando fazer uma Busca entre data ,Mas nãotem retornado nada!
Meu Banco está Timestamp, e meu Objeto é em Calendar.
Minha Busca:

[code]
Criteria criteria = getSession().createCriteria(Backup.class)
.add(Restrictions.ge(“data”, pojo.getDataInicial()))
.add(Restrictions.le(“data”, pojo.getDataFinal()));

	return criteria.list();[/code]

Não Dá Erro Algum… Apenas não retorna Nada!

No Console sai Assim…

Se Alguem Puder me dar Alguma Ideia…

Não consegui ver erros na Query gerada pelo Hibernate. Tem certeza que seus dados estão com as datas esperadas?

Sim… Totalmente… Existe uns 100 Registros entre as Datas buscadas.
Fiz o teste imprimi com System.out o Conteudo das Datas, e tudo ok.

Estou fazendo o Teste Com HQL agora para ver… Mas queria Mesmo em Criteria!

É realmente muito estranho. A query gerada deveria retornar seus valores… Você testou usando “between”? Embora não seja necessário, ele é semântico neste caso.

Sim… Tentei Com Between tbm e nada! Testei Agora com HQL e tbm não Retorna Resultado Nenhum…

[code]StringBuilder hql = new StringBuilder();
hql.append(" from Backup as b");
hql.append(" where b.data >= ? and b.data <= ?");
hql.append(" order by b.data DESC ");
Query query = getSession().createQuery(hql.toString());

    query.setParameter(0, pojo.getDataInicial());  
    query.setParameter(1, pojo.getDataFinal());  
			
	return query.list();[/code]

É Alguma Bobeira Que estou Dando … Mas Não Consigo Achar!

MInha Data Está Assim:@Column(name = "data_backup") private Calendar data;

E no POstgres é Timestamp.

Tente:

hql.append(" where b.data BETWEEN ? and ?"); 

tenta isso

[code]Criteria criteria = getSession().createCriteria(Backup.class)
.add(Restrictions.between(“data”, pojo.getDataInicial().getTime(),
pojo.getDataFinal().getTime()));

return criteria.list();[/code]

Nada.

SQL = Hibernate: select backup0_.id as id2_, backup0_.id_cliente as id6_2_, backup0_.data_backup as data2_2_, backup0_.nome_backup as nome3_2_, backup0_.tamanho as tamanho2_, backup0_.tipo_backup as tipo5_2_ from tb_backup backup0_ where backup0_.data_backup between ? and ? order by backup0_.data_backup DESC

Charles, já Havia tentado… Retorna Erro de Casting… Date to Calendar…

Pra Ser Mais Exato: javax.servlet.ServletException: java.lang.ClassCastException: java.util.Date cannot be cast to java.util.Calendar

Cara, a query está correta. É melhor debugar como os parâmetros foram informados ao banco de dados.

No PostgreSQL você pode logar os statements, para inclusive pegar os valores bindados.

Habilite isso no seu postgresql.conf

Vamos ver como o parâmetro de data foi informado.

Detalhe: Nao esqueça de informar ao hibernate que este campo é um timestamp:

@Type(type=“timestamp”)

Ou um @Temporal(TimeStamp) se vc estiver usando mapeamento JPA.

Cara, Meu PostGres esta em um Server, dai dara trabalho para Alterar essa configuração.

Não Possuia @Type(type=“timestamp”). Quando Coloquei deu o Seguinte erro.

java.lang.IllegalArgumentException: Can not set java.util.Calendar field br.com.autocom.dom.Backup.data to java.sql.Timestamp

Sua propriedade data é um Calendar ou um Date(java.util.Date)?
Se for um Date, que é um Objeto que agrega data e hora, vc precisa avisar no mapeamento. Não conheço a fundo a API nativa do hibernate.

Tente usar a anotação

Edu… é Calendar Minha Data! Coloquei e encerrou aquele Erro… Mais Continua Retornando Nada!

Como TEste, para ver o que vem Fiz o Seguinte:

[code]Criteria criteria = getSession().createCriteria(Backup.class);

	List<Backup> lista = criteria.list();
	System.out.println("Data Inicial:   "+pojo.getDataInicial());
	System.out.println("Data Final:     "+pojo.getDataFinal());
	System.out.println("Data Registro : "+lista.get(0).getData());
	
	System.out.println(lista.get(0).getData().after(pojo.getDataInicial()) && 
			           lista.get(0).getData().before(pojo.getDataFinal()));
		  
		return lista;

[/code]
Retornou isso:

Data Inicial:   java.util.GregorianCalendar[time=-61746699600000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/Sao_Paulo",offset=-10800000,dstSavings=3600000,useDaylight=true,transitions=129,lastRule=java.util.SimpleTimeZone[id=America/Sao_Paulo,offset=-10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=9,startDay=15,startDayOfWeek=1,startTime=0,startTimeMode=0,endMode=3,endMonth=1,endDay=15,endDayOfWeek=1,endTime=0,endTimeMode=0]],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=13,MONTH=4,WEEK_OF_YEAR=19,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=121,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-10800000,DST_OFFSET=0]
Data Final:     java.util.GregorianCalendar[time=-61745058000000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/Sao_Paulo",offset=-10800000,dstSavings=3600000,useDaylight=true,transitions=129,lastRule=java.util.SimpleTimeZone[id=America/Sao_Paulo,offset=-10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=9,startDay=15,startDayOfWeek=1,startTime=0,startTimeMode=0,endMode=3,endMonth=1,endDay=15,endDayOfWeek=1,endTime=0,endTimeMode=0]],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=13,MONTH=4,WEEK_OF_YEAR=21,WEEK_OF_MONTH=3,DAY_OF_MONTH=20,DAY_OF_YEAR=140,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-10800000,DST_OFFSET=0]
Data Registro : java.util.GregorianCalendar[time=1368169200006,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/Sao_Paulo",offset=-10800000,dstSavings=3600000,useDaylight=true,transitions=129,lastRule=java.util.SimpleTimeZone[id=America/Sao_Paulo,offset=-10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=9,startDay=15,startDayOfWeek=1,startTime=0,startTimeMode=0,endMode=3,endMonth=1,endDay=15,endDayOfWeek=1,endTime=0,endTimeMode=0]],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2013,MONTH=4,WEEK_OF_YEAR=19,WEEK_OF_MONTH=2,DAY_OF_MONTH=10,DAY_OF_YEAR=130,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=4,HOUR_OF_DAY=4,MINUTE=0,SECOND=0,MILLISECOND=6,ZONE_OFFSET=-10800000,DST_OFFSET=0]
false

Devia Retornar True! E percebeu que o “time=-61746699600000” tá Negativo NOs Meus Parametros e Positivo no Banco.

CAra Descobri!

No Banco estava Vindo : YEAR=2013
E nos Parametros : YEAR=13

E quem Trazia Esse Parametro!? PRIMEFACES!

Foi só criar uma Data Util, e mudar para 4 casas E resolveu!

Vei Que Luta! kkkkkkkkkkkkk

Mas Deu Tudo Certo Obrigado a Todos!

Recriando os objetos, a partir dos segundos informados no caledários, temos estes valores

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    	Date date = new Date(new Long("-61746699600000"));
    	System.out.println(formatter.format(date));
    	
    	Date date2 = new Date(new Long("-61745058000000"));
    	System.out.println(formatter.format(date2));

        Date date3 = new Date(new Long("1368169200006"));
    	System.out.println(formatter.format(date3));

Resultado:

01/05/0013 00:00:00
20/05/0013 00:00:00
10/05/2013 04:00:00

As datas que vieram do POJO, remetem ao ano 13, e nao 2013.