Problema com between entre datas utilizando criteria

Pessoal, estou com problemas para fazer between entre datas utilizando criteria.
O erro que está dando é o seguinte:

A Montagem do between é a seguinte:

public void betweenDate(Path<Date> path, Date first, Date last) {
		this.getPredicateList().add(this.getCb().between(path, first, last));
	}

Alguns pontos:

  • Este mesmo código está sendo utilizado com sucesso em outra tela.
  • A diferença de uma tela para a outra é unicamente que na que funciona, estou obtendo a data a partir de um componente calendar com a data formatada como dd/mm/yyyy. No segundo caso é apenas mm/yyyy.
  • Antes de mandar a data no formato mm/yyyy ela está sendo convertida para dd/mm/yyyy pegando uma data com o primeiro dia, e uma com o último dia do mês informado. Isto está fazendo certo.
  • Se eu utilizar o calendar formatado com dd/mm/yyyy funciona, mas como a tela precisa exibir apenas mm/yyyy por questões de regra de negócio, preciso resolver desta forma mesmo.
  • Já tentei formatar a data para yyyy/mm/dd, quando faço isso a data, olhando o valor em tempo de execução, fica da seguinte forma: “Tue Jan 01 00:00:00 BRST 2013”

Alguém tem alguma ideia do que posso fazer para resolver?
Preciso muito resolver isso.

Obrigado.

Descobri aonde está o problema, mas não sei o motivo do problema.

Tenha essas duas funções, que retornam a data com o primeiro e com o último dia do mês:

[code]public static Date firstDayDate(Date date) {
Calendar aux = Calendar.getInstance();
aux.setTime(date);
toOnlyDate(aux); //zera os parametros de hour,min,sec,milisec
aux.set(Calendar.DAY_OF_MONTH, aux.getActualMinimum(Calendar.DAY_OF_MONTH));

    return aux.getTime();  
}  

public static Date lastDayDate(Date date) {  
    Calendar aux = Calendar.getInstance();  
    aux.setTime(date);  
    toOnlyDate(aux); //zera os parametros de hour,min,sec,milisec
    aux.set(Calendar.DAY_OF_MONTH, aux.getActualMaximum(Calendar.DAY_OF_MONTH));
    
    return aux.getTime();
} 

[/code]

Se essa linha for comentada, o erro não ocorre:

Alguém sabe o por que? Está errado a forma como estou pegando o primeiro e último dia do mês?

fiz um mainzinho aqui com um testezinho, ve se atende:

public static void main(String[] args) {
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy - HH:mm:ss");
		Calendar dataAtual = Calendar.getInstance();
		System.out.println("data Atual: "+sdf.format(dataAtual.getTime()));

		Calendar dataPrimeiroDia = new GregorianCalendar(dataAtual.get(Calendar.YEAR),dataAtual.get(Calendar.MONTH), 1);
		System.out.println("primeiro dia mes: "+sdf.format(dataPrimeiroDia.getTime()));
		
		Calendar dataUltimoDia = dataPrimeiroDia;
		dataUltimoDia.add(Calendar.MONTH, 1);
		
		dataUltimoDia.add(Calendar.DAY_OF_MONTH, -1);
		System.out.println("ultimo dia mes: "+sdf.format(dataUltimoDia.getTime()));
	}

resultado:
data Atual: 16/01/2013 - 13:49:52
primeiro dia mes: 01/01/2013 - 00:00:00
ultimo dia mes: 31/01/2013 - 00:00:00

[quote=filipechaves]fiz um mainzinho aqui com um testezinho, ve se atende:

public static void main(String[] args) {
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy - HH:mm:ss");
		Calendar dataAtual = Calendar.getInstance();
		System.out.println("data Atual: "+sdf.format(dataAtual.getTime()));

		Calendar dataPrimeiroDia = new GregorianCalendar(dataAtual.get(Calendar.YEAR),dataAtual.get(Calendar.MONTH), 1);
		System.out.println("primeiro dia mes: "+sdf.format(dataPrimeiroDia.getTime()));
		
		Calendar dataUltimoDia = dataPrimeiroDia;
		dataUltimoDia.add(Calendar.MONTH, 1);
		
		dataUltimoDia.add(Calendar.DAY_OF_MONTH, -1);
		System.out.println("ultimo dia mes: "+sdf.format(dataUltimoDia.getTime()));
	}

resultado:
data Atual: 16/01/2013 - 13:49:52
primeiro dia mes: 01/01/2013 - 00:00:00
ultimo dia mes: 31/01/2013 - 00:00:00

[/quote]

Cara, funcionou ± com o que tu colocou.
Acabei de descobrir que se depois de eu setar o data no calendar da problema. Ai tive que fazer essa gambiarra abaixo.

public static Date firstDayDate(Date date) {  
        Calendar dataAtual = Calendar.getInstance();  
        
        dataAtual.setTime(date);
        
        Calendar dataPrimeiroDia = new GregorianCalendar(dataAtual.get(Calendar.YEAR),dataAtual.get(Calendar.MONTH), 1);  
        
        Calendar retorno = Calendar.getInstance();
        
        retorno.set(dataPrimeiroDia.get(Calendar.YEAR), dataPrimeiroDia.get(Calendar.MONTH), dataPrimeiroDia.get(Calendar.DAY_OF_MONTH),0,0,0);
        
        return retorno.getTime();
    }  

Desta forma funciona, mas se eu retornar direto dataPrimeiroDia.getTime() ai da erro. Muito estranho.
Enfim, se algum souber o por que acontece isso.

Mas o problema a principio está resolvido.
Obrigado.

Pessoal, voltando aqui. Por que na verdade não consegui revolver o problema, mas consegui descobrir o que está gerando.

O problema acontece com campos que estão definidos como date no SqlServer. Quando os defino como datetime, ai realmente funciona. Porém, não quero apenas contornar o problema, mudando os campos para datetime. Quero descobrir como resolver isso de forma que funcione com os campos definidos como date.

Alguém já passou por problema semelhante? Se precisarem de informações extras, é só falar.

Problema resolvido.
No bean, deve ser colocado uma das seguintes anotações:

@Temporal(TemporalType.DATE)

ou

@Type(type=“date”)