felipempantoja:
Então, mudando pra criteria seria bem simples, a não ser pelo fato de eu estar comparando as duas datas convertidas pra string no formato dd/MM/yyyy já que a hora é irrelevante pra essa minha consulta, daí não consigo fazer isso usando criteria, seria algo do tipo:
DetachedCriteria crit = DetachedCriteria.forClass(Entity.class, "e")
.add(Restrictions.eq("e.name", entity.getName()))
.add(Restrictions.eq("to_char(e.date, 'dd/MM/yyyy')", entity.getDate()))
Mas não funciona tentando converter a data dentro dessa restrição aí =/
Alguma sugestão??? :D
como eu axo criteria mais legal, mesmo vendo que vc fez com HQL, que ainda por cima usa coisa nativa da base de dados... segue uma solução com Criteria...
DetachedCriteria crit = DetachedCriteria.forClass(Entity.class, "e")
.add(Restrictions.eq("e.name", entity.getName()))
.add(Restrictions.between("e.date",
DateUtils.lowDateTime(entity.getDate()),
DateUtils.highDateTime(entity.getDate())));
Ou seja, ele vai buscar o valores da date entre... 00h:00m:00s e 000ms e 23h:59m:59s e 999ms ... em resumo, vai encontrar qualquer valor igual a apenas o dia, não conciderando Times....
segue o trecho usado da classe DateUtils
import java.util.Calendar;
import java.util.Date;
/**
*
* @author Tomaz Lavieri
*/
public class DateUtils {
/**
* Não é possivel instanciar DateUtils.
*/
private DateUtils(){}
/**
* Retorna o valor do horário minimo para a data de referencia passada.
* <BR>
* <BR> Por exemplo se a data for "30/01/2009 as 17h:33m:12s e 299ms" a data
* retornada por este metodo será "30/01/2009 as 00h:00m:00s e 000ms".
* @param date de referencia.
* @return {@link Date} que representa o horário minimo para dia informado.
*/
public static Date lowDateTime(Date date) {
Calendar aux = Calendar.getInstance();
aux.setTime(date);
toOnlyDate(aux); //zera os parametros de hour,min,sec,milisec
return aux.getTime();
}
/**
* Retorna o valor do horário maximo para a data de referencia passada.
* <BR>
* <BR> Por exemplo se a data for "30/01/2009 as 17h:33m:12s e 299ms" a data
* retornada por este metodo será "30/01/2009 as 23h:59m:59s e 999ms".
* @param date de referencia.
* @return {@link Date} que representa o horário maximo para dia informado.
*/
public static Date highDateTime(Date date) {
Calendar aux = Calendar.getInstance();
aux.setTime(date);
toOnlyDate(aux); //zera os parametros de hour,min,sec,milisec
aux.roll(Calendar.DATE, true); //vai para o dia seguinte
aux.roll(Calendar.MILLISECOND, false); //reduz 1 milisegundo
return aux.getTime();
}
/**
* Zera todas as referencias de hora, minuto, segundo e milesegundo do
* {@link Calendar}.
* @param date a ser modificado.
*/
public static void toOnlyDate(Calendar date) {
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
}
}
sei que a principio pode parecer uma solução muito extensa, mais veja que não é...
DateUtils é uma classe utilitaria, e esse código pode ser reusado a qualquer momento no seu projeto....
então o código resumes a invocar... DateUtils.highDateTime(Date) e DateUtils.lowDateTime(Date)
espero que te ajude