Hibernate Criteria: Comparar datas

Olá pessoal :smiley:
Estou com uma dúvida na utilização de criteria no hibernate. Eu estava usando HQL numa consulta, porém existem muitos filtros opcionais daí eu tinha que ficar criando condição no meio da query e ir dando append numa StringBuffer, aí não fica muito legível dessa forma, além de nada “elegante” :smiley:

Eis a minha query HQL:

[code]List<String> paramNames = new ArrayList<String>();
List<Object> values = new ArrayList<Object>();
StringBuffer qry = new StringBuffer();
qry.append(“select g from Entity e where g.name is not null and g.data is not null”);

if(entity.getName() != null) {
qry.append(" and e.name = :name");
paramNames.add(“name”);
values.add(entity.getName());
}
if(entity.getDate() != null) {
qry.append(" and to_char(g.date, ‘dd/MM/yyyy’) = :date");
paramNames.add(“date”);
values.add(new SimpleDateFormat(“dd/MM/yyyy”).format(entity.getDate()));
}[/code]

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??? :smiley:

Alguém? :smiley:

estava querendo a mesma coisa.
Utilizei o Restrictions.sqlRestriction onde posso passar um comando sql diretamente para a consulta, no meu caso utilizei o código abaixo.

criteria.add(Restrictions.sqlRestriction("convert(varchar,dtConsulta,103) = ?", dtConsulta,Hibernate.DATE));

onde “convert(varchar,dtConsulta,103)” é a forma como converto em sql no meu BD (sqlServer).

Show, o único problema é que amarra a consulta a um determinado banco.
Mas aqui isso é o de menos, funcionou legal!

Valeu cara! :smiley:

é tem isso!
se resolver se modo sem amarrar ao banco me manda!
flws

Bom como vcs jah disseram isso eh nativo de banco, acredito q usando hql da forma correta seria o mais viável(minha opnião);

Seu campo eh dateTime, ou TimesTamp, ou seja, armazena hora:minuto:segundo tbm? ou eh soh Date? vc pode fazer assim:

	//se o campo for do dateTime, ou TimesTamp para poder "ignonar" a hh:mm:ss 
	public List<SuaClasse> buscarPorData(Date dataIni, Date dataFim){//pode passar a mesma data para os dois parametro.
	                
		Calendar periodoInicial = Calendar.getInstance(); 
		Calendar periodoFinal = Calendar.getInstance();
		
		periodoInicial.setTime(dataIni);
		periodoFinal.setTime(dataFim);
		
		//zerando hora do periodo inicial		
		periodoInicial.set(Calendar.HOUR_OF_DAY, 0);
		periodoInicial.set(Calendar.MINUTE, 0);
		periodoInicial.set(Calendar.SECOND, 0);
		
		//inicializando hora do peridoFinal
		periodoFinal.set(Calendar.HOUR_OF_DAY, 23);
		periodoFinal.set(Calendar.MINUTE, 59);
		periodoFinal.set(Calendar.SECOND, 59);
		
		Query q = session.createQuery("SELECT a FROM Classe a WHERE a.beanData BETWEEN ? AND ?  ");
		q.setParameter(0, periodoInicial.getTime());
		q.setParameter(1, periodoFinal.getTime());
		return q.list();
		
		
		//agora se o seu campo nao armazena hh:mm:ss 
		//vc usa o mesmo metod sem precisar usar o Calendar. basta fazer assim
		Query q = session.createQuery("SELECT a FROM Classe a WHERE a.beanData BETWEEN ? AND ?  ");
		q.setParameter(0, dataIni;
		q.setParameter(1, dataFim);
	}

Da forma como foi feito acima vc pode inserindo nas suas condições o “?” e setar os parametros de acordo com as suas posições. Não precisa usar o SimpleDateFormat para formatar para dd/MM/yyyy visto que o padrão JDBC eh o formato americano yyyy-MM-dd.

Falae ebarros :smiley:

Aqui os campos no banco são do tipo timestamp, só que nesse caso específico eu queria simplesmente “ignorar” o time dessas datas, usando o comando to_char do próprio HQL isso resolve o meu problema, o lance seria evitar as condições (se == null) para incluir ou não na query a comparação das datas por exemplo.
Daí achei que usando criteria ficaria mais “elegante” digamos assim, e não uma query quebrada cheia de condições. :smiley:

De qualquer maneira valeu pela ajuda! :smiley:

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[code]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.


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


    • 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);
      }
      }[/code]

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

1 curtida

Lavieri,

Show, e nem é extenso, ficou muito bom, eu estava tentando sempre converter a data pra eliminar as horas, mas com a classe utilitária isso resolve o meu problema sem precisar usar query nativa ou um HQL todo quebrado. Muito bom!

Obrigado a todos :smiley:

Aproveitando…
Sabe se existe alguma coisa no criteria pra incluir uma condição no where somente se o parâmetro não for null?
Daí eu evito if/else no criteria tb :smiley:

Abraços!

[quote=felipempantoja]Aproveitando…
Sabe se existe alguma coisa no criteria pra incluir uma condição no where somente se o parâmetro não for null?
Daí eu evito if/else no criteria tb :smiley:

Abraços![/quote]

Se o campo “e.name” for nulo ou se o cmapo “e.name” não for nulo

Restrictions.isNotNull("e.name"); Restrictions.isNull("e.name");

Lavieri,

Valeuuu cara, vou testar e posto aqui já! :smiley:

Duvida quando uso

um campo data onde quero que esse campo seja >=

e no banco de dados esse campo foi gravado com horário

e ao consultar na tela é solicitado uma data informo "01/02/2009" --> dataIn

e existe outro campo data final onde digito informo "31/12/2009" -->dataFin

não volta o registro pois no banco o :

campo data_start —> "01/02/2009 12:12:09"
campo data_start —> "31/12/2009 13:10:09"

alguém poderia me ajudar …


  criteria.add(Restrictions.ge(&quot;e.data_start&quot;, detailIn.getValue());
  criteria.add(Restrictions.le(&quot;e.data_finish&quot;, detailFi.getValue());	

baixa o arquivo que coloquei aki o DataUtils, e usa assim


  criteria.add(Restrictions.ge(&quot;e.data_start&quot;, DateUtils.lowDateTime(detailIn.getValue()));
  criteria.add(Restrictions.le(&quot;e.data_finish&quot;, DateUtils.highDateTime(detailFi.getValue()));	

Olá,

duvida usando sua rotina quando
monto criteria usando "=" não encontra o registro abaixo ???


if(detail.getOperator().equals(&quot;=&quot;))
   criteria.add(Restrictions.eq(detail.getColumn(),CriteriaSearchDetail.checkTypeOfClass(classTableName, detail.getColumn(), detail.getValue(),detail.getOperator())));
-- nobanco de dados está gravado assim 
data_antes -&gt; 14/04/2009 02:55:22

data_depois -&gt; 14/04/2009 02:55:22

--implemetação
 public static Object checkTypeOfClass(String classTable, String field , String value , String operator  ){
	     String out     =  &quot;noData&quot;;
	     String type    =  null;
	     Object retorno =  null;
		 try {
             Class&lt;?&gt; cls = Class.forName(classTable);
             Field fieldlist[] = cls.getDeclaredFields();
             for (int i = 0; i &lt; fieldlist.length; i++) {
                  Field fld = fieldlist[i];
                  if(fld.getName().equals(field)){
                      type = fld.getType().toString();
                      if (type.indexOf(&quot;Calendar&quot;)&gt;0  ||type.indexOf(&quot;GregorianCalendar&quot;)&gt;0){
                           	 out =&quot;Data&quot;;
                           	 break;
                      }else if (type.indexOf(&quot;Date&quot;)&gt;0){
                 	     out= &quot;Date&quot;;
                 	     break;                           	 
                           	 
                      }else if (type.indexOf(&quot;Long&quot;)&gt;0){
                    	     out= &quot;Long&quot;;
                    	     break;
                      }else if (type.indexOf(&quot;String&quot;)&gt;0){
                    	     out= &quot;String&quot;;
                    	     break;
                      }else if (type.indexOf(&quot;ImsObjectState&quot;)&gt;0){
                 	     out= &quot;ImsObjectState&quot;;
                 	     break;   
                      }else if (type.indexOf(&quot;DeviceState&quot;)&gt;0){
                  	     out= &quot;DeviceState&quot;;
                  	     break;                     	     
                      } else {
                    	  //assume o tipo conhecido e pego da entidade
                    	  out = type;
                      }
                                  
                  }
             }
             
           if (out.equals(&quot;Long&quot;)){
              retorno = Long.valueOf(value);	   
           }else if(out.equals(&quot;Data&quot;)){
        	  retorno =  convertStringToCalendar(value);
           }else if(out.equals(&quot;Date&quot;)){
        	  retorno =  convertStringToDate(value ,operator);  
    
--------------------
public static Date convertStringToDate(String date,String operator) throws BaseException {
		Date out = null;
		SimpleDateFormat dateFormat = new SimpleDateFormat(&quot;dd/MM/yyyy&quot;);  
		
		try {
			Date dataTODate = dateFormat.parse(date);
			
			if (operator.equals(&quot;=&quot;)||operator.equals(&quot;&gt;&quot;)||operator.equals(&quot;&gt;=&quot;)||operator.equals(&quot;!&quot;)){
				out = DateUtils.lowDateTime(dataTODate);	
			}else{
				out = DateUtils.highDateTime(dataTODate);
			}
		} catch(Exception e) {
		}
		return out;
	}

Olá pessoal, estou com um problema tb na questão de converter de Date para String… tenho mto pouco conhecimento em criteria e estou fazendo ela assim:

[code]@SuppressWarnings(“unchecked”)
public List<Audiencia> pesquisaAudiencias(Date data_audiencia,
Date data_peticao, String anotacoes, Processo processo) {
Criteria c = session.createCriteria(Audiencia.class);
c.add(Restrictions.eq(“data_audiencia”, “%” + data_audiencia + “%”));
c.add(Restrictions.eq(“data_peticao”, “%” + data_peticao + “%”));
c.add(Restrictions.ilike(“anotacoes”, “%” + anotacoes + “%”));
c.add(Restrictions.ilike(“processo”, “%” + processo + “%”));
c.addOrder(Order.asc(“data_audiencia”));

	return c.list();
}[/code]

Só que me dá o seguinte erro:

[code]An Error Occurred:
javax.el.ELException: /pages/audiencia/resultado.xhtml @15,150 rendered="#{not empty audienciaBean.buscaAudiencia}": Error reading ‘buscaAudiencia’ on type br.com.swej.bean.AudienciaBean
Caused by: javax.el.ELException: /pages/audiencia/resultado.xhtml @15,150 rendered="#{not empty audienciaBean.buscaAudiencia}": Error reading ‘buscaAudiencia’ on type br.com.swej.bean.AudienciaBean
at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:76)
at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:370)
… 37 more
Caused by: java.lang.NullPointerException
at java.util.Calendar.setTime(Calendar.java:1075)
at br.com.swej.util.DateUtils.lowDateTime(DateUtils.java:23)
at br.com.swej.dao.AudienciaDAO.pesquisaAudiencias(AudienciaDAO.java:72)
at br.com.swej.bean.AudienciaBean.getBuscaAudiencia(AudienciaBean.java:121)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)
at org.apache.el.parser.AstValue.getValue(AstValue.java:118)
at org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:45)
at org.apache.el.parser.AstNot.getValue(AstNot.java:42)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
… 38 more

[/code]
Se alguem puder ajudar, agradeço!!
Flws

usa esse codigo abaixo para data que da certo…usei ok!!!

foi m membro do grupo que passou e funciona mesmo???


   1. import java.util.Calendar;  
   2. import java.util.Date;  
   3.   
   4. /** 
   5. * 
   6. * @author Tomaz Lavieri 
   7. */  
   8. public class DateUtils {  
   9.     /** 
  10.      * Não é possivel instanciar DateUtils. 
  11.      */  
  12.     private DateUtils(){}  
  13.       
  14.     /** 
  15.      * Retorna o valor do horário minimo para a data de referencia passada. 
  16.      * <BR> 
  17.      * <BR> Por exemplo se a data for "30/01/2009 as 17h:33m:12s e 299ms" a data 
  18.      * retornada por este metodo será "30/01/2009 as 00h:00m:00s e 000ms". 
  19.      * @param date de referencia. 
  20.      * @return {@link Date} que representa o horário minimo para dia informado. 
  21.      */  
  22.     public static Date lowDateTime(Date date) {  
  23.         Calendar aux = Calendar.getInstance();  
  24.         aux.setTime(date);  
  25.         toOnlyDate(aux); //zera os parametros de hour,min,sec,milisec  
  26.         return aux.getTime();  
  27.     }  
  28.       
  29.     /** 
  30.      * Retorna o valor do horário maximo para a data de referencia passada. 
  31.      * <BR> 
  32.      * <BR> Por exemplo se a data for "30/01/2009 as 17h:33m:12s e 299ms" a data 
  33.      * retornada por este metodo será "30/01/2009 as 23h:59m:59s e 999ms". 
  34.      * @param date de referencia. 
  35.      * @return {@link Date} que representa o horário maximo para dia informado. 
  36.      */  
  37.     public static Date highDateTime(Date date) {  
  38.         Calendar aux = Calendar.getInstance();  
  39.         aux.setTime(date);  
  40.         toOnlyDate(aux); //zera os parametros de hour,min,sec,milisec  
  41.         aux.roll(Calendar.DATE, true); //vai para o dia seguinte  
  42.         aux.roll(Calendar.MILLISECOND, false); //reduz 1 milisegundo  
  43.         return aux.getTime();  
  44.     }  
  45.   
  46.     /** 
  47.      * Zera todas as referencias de hora, minuto, segundo e milesegundo do 
  48.      * {@link Calendar}. 
  49.      * @param date a ser modificado. 
  50.      */  
  51.     public static void toOnlyDate(Calendar date) {  
  52.         date.set(Calendar.HOUR_OF_DAY, 0);  
  53.         date.set(Calendar.MINUTE, 0);  
  54.         date.set(Calendar.SECOND, 0);  
  55.         date.set(Calendar.MILLISECOND, 0);  
  56.     }  
  57. }  

[quote=paribe]usa esse codigo abaixo para data que da certo…usei ok!!!

foi m membro do grupo que passou e funciona mesmo???

[code]

  1. import java.util.Calendar;
  2. import java.util.Date;
  3. /**
    • @author Tomaz Lavieri
  4. */
  5. public class DateUtils {
  6. /** 
    
  7.  * Não é possivel instanciar DateUtils. 
    
  8.  */  
    
  9. private DateUtils(){}  
    
  10. /** 
    
  11.  * Retorna o valor do horário minimo para a data de referencia passada. 
    
  12.  * <BR> 
    
  13.  * <BR> Por exemplo se a data for "30/01/2009 as 17h:33m:12s e 299ms" a data 
    
  14.  * retornada por este metodo será "30/01/2009 as 00h:00m:00s e 000ms". 
    
  15.  * @param date de referencia. 
    
  16.  * @return {@link Date} que representa o horário minimo para dia informado. 
    
  17.  */  
    
  18. public static Date lowDateTime(Date date) {  
    
  19.     Calendar aux = Calendar.getInstance();  
    
  20.     aux.setTime(date);  
    
  21.     toOnlyDate(aux); //zera os parametros de hour,min,sec,milisec  
    
  22.     return aux.getTime();  
    
  23. }  
    
  24. /** 
    
  25.  * Retorna o valor do horário maximo para a data de referencia passada. 
    
  26.  * <BR> 
    
  27.  * <BR> Por exemplo se a data for "30/01/2009 as 17h:33m:12s e 299ms" a data 
    
  28.  * retornada por este metodo será "30/01/2009 as 23h:59m:59s e 999ms". 
    
  29.  * @param date de referencia. 
    
  30.  * @return {@link Date} que representa o horário maximo para dia informado. 
    
  31.  */  
    
  32. public static Date highDateTime(Date date) {  
    
  33.     Calendar aux = Calendar.getInstance();  
    
  34.     aux.setTime(date);  
    
  35.     toOnlyDate(aux); //zera os parametros de hour,min,sec,milisec  
    
  36.     aux.roll(Calendar.DATE, true); //vai para o dia seguinte  
    
  37.     aux.roll(Calendar.MILLISECOND, false); //reduz 1 milisegundo  
    
  38.     return aux.getTime();  
    
  39. }  
    
  40. /** 
    
  41.  * Zera todas as referencias de hora, minuto, segundo e milesegundo do 
    
  42.  * {@link Calendar}. 
    
  43.  * @param date a ser modificado. 
    
  44.  */  
    
  45. public static void toOnlyDate(Calendar date) {  
    
  46.     date.set(Calendar.HOUR_OF_DAY, 0);  
    
  47.     date.set(Calendar.MINUTE, 0);  
    
  48.     date.set(Calendar.SECOND, 0);  
    
  49.     date.set(Calendar.MILLISECOND, 0);  
    
  50. }  
    
  51. }

[/code][/quote]
Eu vi a classe e coloquei no projeto. Só estou com dúvida em como devo usa-la…
por exemplo, tentei mudar minha criteria para isso:

[code] @SuppressWarnings(“unchecked”)
public List<Audiencia> pesquisaAudiencias(Date data_audiencia,
Date data_peticao, String anotacoes, Processo processo) {
Criteria c = session.createCriteria(Audiencia.class);
c.add(Restrictions.between(“data_audiencia”, DateUtils
.lowDateTime(data_audiencia), DateUtils
.highDateTime(data_audiencia)));
c.add(Restrictions.between(“data_peticao”, DateUtils
.lowDateTime(data_peticao), DateUtils
.highDateTime(data_peticao)));
c.add(Restrictions.ilike(“anotacoes”, “%” + anotacoes + “%”));
c.add(Restrictions.ilike(“processo”, “%” + processo + “%”));
c.addOrder(Order.asc(“data_audiencia”));

	return c.list();
}[/code]

E mesmo assim, ainda dá o mesmo erro…
E agora?

Aparentemente o erro nem é por parte do Criteria do Hibernate, dá dando um NullPointerException…

Caused by: java.lang.NullPointerException at java.util.Calendar.setTime(Calendar.java:1075) at br.com.swej.util.DateUtils.lowDateTime(DateUtils.java:23) at br.com.swej.dao.AudienciaDAO.pesquisaAudiencias(AudienciaDAO.java:72) at br.com.swej.bean.AudienciaBean.getBuscaAudiencia(AudienciaBean.java:121)

Dá uma debugada no seu método lowDateTime da sua classe DateUtils e vê se ele realmente tá retornando alguma coisa… Provavelmente os parâmetros data_audiencia ou data_peticao estão chegando nulos no método pesquisaAudiencias…

[quote=felipempantoja]Aparentemente o erro nem é por parte do Criteria do Hibernate, dá dando um NullPointerException…

Caused by: java.lang.NullPointerException at java.util.Calendar.setTime(Calendar.java:1075) at br.com.swej.util.DateUtils.lowDateTime(DateUtils.java:23) at br.com.swej.dao.AudienciaDAO.pesquisaAudiencias(AudienciaDAO.java:72) at br.com.swej.bean.AudienciaBean.getBuscaAudiencia(AudienciaBean.java:121)

Dá uma debugada no seu método lowDateTime da sua classe DateUtils e vê se ele realmente tá retornando alguma coisa… Provavelmente os parâmetros data_audiencia ou data_peticao estão chegando nulos no método pesquisaAudiencias…[/quote]
Pois é felipe, quando reportei o erro naum tinha usado ainda essa classe…depois q a inclui no projeto, fiz a alteração daquela criteria para isso:

[code]@SuppressWarnings(“unchecked”)
public List<Audiencia> pesquisaAudiencias2(Date data_audiencia,
Date data_peticao, String anotacoes, Processo processo) {
Criteria c = session.createCriteria(Audiencia.class);
c.add(Restrictions.between(“data_audiencia”, DateUtils
.lowDateTime(data_audiencia), DateUtils
.highDateTime(data_audiencia)));
c.add(Restrictions.between(“data_peticao”, DateUtils
.lowDateTime(data_peticao), DateUtils
.highDateTime(data_peticao)));
c.add(Restrictions.ilike(“anotacoes”, “%” + anotacoes + “%”));
c.add(Restrictions.ilike(“processo”, “%” + processo + “%”));
c.addOrder(Order.asc(“data_audiencia”));

	return c.list();
}[/code]

O erro que me retorna é esse:

Caused by: java.lang.NullPointerException at java.util.Calendar.setTime(Calendar.java:1075) at br.com.swej.util.DateUtils.lowDateTime(DateUtils.java:23) at br.com.swej.dao.AudienciaDAO.pesquisaAudiencias2(AudienciaDAO.java:85) at br.com.swej.bean.AudienciaBean.getBuscaAudiencia(AudienciaBean.java:121) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.getValue(BeanELResolver.java:62) at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53) at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64) at org.apache.el.parser.AstValue.getValue(AstValue.java:118) at org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:45) at org.apache.el.parser.AstNot.getValue(AstNot.java:42) at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71) ... 38 more
Um colega me disse para retirar as “%” da primeira tentativa. eu alterei e ficou assim:

[code]@SuppressWarnings(“unchecked”)
public List<Audiencia> pesquisaAudiencias(Date data_audiencia,
Date data_peticao, String anotacoes, Processo processo) {
Criteria c = session.createCriteria(Audiencia.class);
c.add(Restrictions.eq(“data_audiencia”, data_audiencia));
c.add(Restrictions.eq(“data_peticao”, data_peticao));
c.add(Restrictions.ilike(“anotacoes”, “%” + anotacoes + “%”));
c.add(Restrictions.ilike(“processo”, “%” + processo + “%”));
c.addOrder(Order.asc(“data_audiencia”));

	return c.list();
}[/code]

e me retorna esse erro:

Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field br.com.swej.estrutura.Processo.id to java.lang.String at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150) at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37) at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:18) at java.lang.reflect.Field.get(Field.java:358) at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:32) ... 70 more

hehehe, ô trem dificil…
ah, e detalhe: sempre q eu insiro a data no banco, por exemplo: 02/02/2010, no banco fica sempre no dia anterior… to percebendo muita dificuldade em trabalhar com data no banco e nas criterias…
Eae pessoal, alguma sugestão??

Cara, eu sugiro fazer algo mais ou menos assim no teu método que monta a criteria:

[code]@SuppressWarnings(“unchecked”)
public List<Audiencia> pesquisaAudiencias(Date data_audiencia, Date data_peticao, String anotacoes, Processo processo) {
Criteria c = session.createCriteria(Audiencia.class);

if(data_audiencia != null) {
	c.add(Restrictions.between("data_audiencia", DateUtils.lowDateTime(data_audiencia), DateUtils.highDateTime(data_audiencia)));
}
if(data_peticao != null) {
	c.add(Restrictions.between("data_peticao", DateUtils.lowDateTime(data_peticao), DateUtils.highDateTime(data_peticao)));
}

c.add(Restrictions.ilike("anotacoes", "%" + anotacoes + "%"));
c.add(Restrictions.ilike("processo", "%" + processo + "%"));
c.addOrder(Order.asc("data_audiencia"));

return c.list();

}[/code]

Se vc estiver tentando verificar se o processo no banco é igual ao processo que vc está passando por parâmetro, o ilike não vai funcionar, pq processo é um objeto da sua regra de negócios e não uma String (a não ser que vc tenha implementado o toString dele, mas não tenho certeza se funciona dessa maneira), o ideal seria o eq (equals):

Mude de:

Para: