Hibernate Criteria: Comparar datas

[quote=felipempantoja]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:

Felipe, meu amigo, segui a sua sugestão e tive o mesmo problema…

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
Eita negocio complicado…

Parece que o atributo id da sua classe Processo deveria ser uma String e está como Long, tenta mudar esse atributo de Long pra String e roda de novo a aplicação…
Sabe qual o tipo desse campo ID no banco de dados? Se for char esse deve estar sendo o problema.

[quote=felipempantoja]Parece que o atributo id da sua classe Processo deveria ser uma String e está como Long, tenta mudar esse atributo de Long pra String e roda de novo a aplicação…
Sabe qual o tipo desse campo ID no banco de dados? Se for char esse deve estar sendo o problema.[/quote]

Mas o id da classe pode ser String??

[code]@Entity
@Table(name = “processo”)
public class Processo {

@Id
@GeneratedValue
@Column(name = "id_processo")
private Long id; 

@Column(name = "processo")
private String processo;[/code]

Os atributos para o id naum devem ser Long ou Integer?? será q é realmente isso q está atrapalhando?

Não é uma boa idéia, mas funciona assim mesmo…
Se o ID no banco estiver como char/varchar, vai dar problema se o seu id da classe mapeada for Integer/Long.
Se vc puder mudar o tipo do campo do banco pra INT/BIGINT é bom, senão muda o id da sua classe pra String…

Mas é esse o seu problema? Qual o tipo da sua chave ID no banco?

[quote=felipempantoja]Não é uma boa idéia, mas funciona assim mesmo…
Se o ID no banco estiver como char/varchar, vai dar problema se o seu id da classe mapeada for Integer/Long.
Se vc puder mudar o tipo do campo do banco pra INT/BIGINT é bom, senão muda o id da sua classe pra String…

Mas é esse o seu problema? Qual o tipo da sua chave ID no banco?[/quote]

O Id do banco é do tipo BIGINT(20), e nas classes é do tipo Long.

Então não é esse o problema não… manda o stackTrace completo aí… das exceptions.

javax.faces.FacesException: 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 javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:373) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:880) at javax.faces.render.Renderer.encodeChildren(Renderer.java:137) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886) at javax.faces.render.Renderer.encodeChildren(Renderer.java:137) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:594) at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108) at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:237) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:307) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at br.com.swej.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:23) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619) 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: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.com.swej.estrutura.Processo.id at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:35) at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:183) at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3591) at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3307) at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181) at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:218) at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397) at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:87) at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1707) at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1678) at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1563) at org.hibernate.loader.Loader.doQuery(Loader.java:673) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.doList(Loader.java:2220) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) at org.hibernate.loader.Loader.list(Loader.java:2099) at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569) at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283) at br.com.swej.dao.AudienciaDAO.pesquisaAudiencias(AudienciaDAO.java:78) 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 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

Felipe, amigao, realmente o problema era o Processo. Eu removi da expressão, e naum deu mais aquele erro… entretanto deu outro no console:

31/01/2010 15:39:29 com.sun.faces.lifecycle.RenderResponsePhase execute INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed. sourceId=buscacliente:Busca:anotacoes[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'. ), detail=(Conversion Error setting value '' for 'null Converter'. )] sourceId=buscacliente:Busca:nomeInput[severity=(ERROR 2), summary=(Conversion Error setting value '2010' for 'null Converter'. ), detail=(Conversion Error setting value '2010' for 'null Converter'. )] sourceId=buscacliente:Busca:nomeInput2[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'. ), detail=(Conversion Error setting value '' for 'null Converter'. )]

O metodo no Dao ficou assim:

[code] @SuppressWarnings(“unchecked”)
public List<Audiencia> pesquisaAudiencias3(Date data_audiencia,
Date data_peticao, String anotacoes) {
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.eq("processo", "%" + processo + "%"));
	c.addOrder(Order.asc("data_audiencia"));

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

e no xhtml está assim:

[code]<rich:tabPanel>
<rich:tab label=“Busca Audiência”>
<h:form id=“Busca”>
<h:outputLabel for=“nomeLabel” value=“Data da Audiência: " id=“busca-dataaudiencia”/>
<h:inputText id=“nomeInput” value=”#{audienciaBean.audiencia.data_audiencia}" />

<h:outputLabel for=“nomeLabel2” value=“Data da Petição: " id=“busca-datapeticao”/>
<h:inputText id=“nomeInput2” value=”#{audienciaBean.audiencia.data_peticao}" />

<h:commandButton value=“Pesquisar” action="#{audienciaBean.getListaAudiencias}" />
<input type=“button” value=“Limpar” onclick=“reset()”/>

&lt;/h:form&gt;	
&lt;rich:spacer height="10"/&gt;
&lt;rich:separator height="1" lineType="dotted"/&gt;
&lt;rich:spacer height="10"/&gt;


&lt;/rich:tab&gt;

&lt;/rich:tabPanel&gt;

</h:panelGrid>

&lt;rich:spacer height="10"/&gt;
&lt;rich:separator height="1" lineType="dotted"/&gt;
&lt;rich:spacer height="10"/&gt;

&lt;ui:include src="resultado.xhtml" /&gt;
	

&lt;/h:form&gt;	[/code]

Acho q agora ficou mais fácil de resolver, né? Ah, outra coisa: a data que eu insiro naum é gravada no banco igual: sempre 1 dia anterior.

Dá uma olhada na linha 78 da sua classe AudienciaDAO, como tá mostrando a sua exception:

[quote=felipempantoja]Dá uma olhada na linha 78 da sua classe AudienciaDAO, como tá mostrando a sua exception:

Essa linha se referia a um método q usei anteriormente…
O erro agora é esse:

31/01/2010 16:06:35 com.sun.faces.lifecycle.RenderResponsePhase execute INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed. sourceId=buscacliente:Busca:anotacoes[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'. ), detail=(Conversion Error setting value '' for 'null Converter'. )] sourceId=buscacliente:Busca:nomeInput[severity=(ERROR 2), summary=(Conversion Error setting value '2010' for 'null Converter'. ), detail=(Conversion Error setting value '2010' for 'null Converter'. )] sourceId=buscacliente:Busca:nomeInput2[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'. ), detail=(Conversion Error setting value '' for 'null Converter'. )]

[quote=Kleber-rr][quote=felipempantoja]Dá uma olhada na linha 78 da sua classe AudienciaDAO, como tá mostrando a sua exception:

Essa linha se referia a um método q usei anteriormente…
O erro agora é esse:

31/01/2010 16:06:35 com.sun.faces.lifecycle.RenderResponsePhase execute INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed. sourceId=buscacliente:Busca:anotacoes[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'. ), detail=(Conversion Error setting value '' for 'null Converter'. )] sourceId=buscacliente:Busca:nomeInput[severity=(ERROR 2), summary=(Conversion Error setting value '2010' for 'null Converter'. ), detail=(Conversion Error setting value '2010' for 'null Converter'. )] sourceId=buscacliente:Busca:nomeInput2[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'. ), detail=(Conversion Error setting value '' for 'null Converter'. )][/quote]

Parece ser erro de conversão do JSF, o seu campo deveria atualizar um Date no bean mas tá mandando uma String, assim como tudo que sai da view e vai pro controller (por isso o uso dos converters). Tenta usar isso no seus inputText:

[code]<h:inputText id=“nomeInput” value="#{audienciaBean.audiencia.data_audiencia}">
<f:convertDateTime type=“date” pattern=“dd/MM/yyyy”/>
</h:inputText>

<h:inputText id=“nomeInput2” value="#{audienciaBean.audiencia.data_peticao}">
<f:convertDateTime type=“date” pattern=“dd/MM/yyyy”/>
</h:inputText>[/code]

Blz felipe. Eu tinha colocado depois o converter, o problema q agora ele de cara me retorna a lista preenchida com todos os itens, sem q eu tenha inserido data alguma…
Me diz uma coisa: como eu posso fazer uma critéria com uma data aproximada?? tipo quero pesquisar audiencias entre as datas X e Y??

[quote=Lavieri]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…

[/quote]
Lavieri, tem como vc postar esse teu método completo pra ver se eu entendo? me diz uma coisa: o que são basicamente o lowDateTime e o higDateTime??

Funcionou pessoal. Só estou com problema agora numa questão: as datas q insiro no banco não são gravadas igual a digitada no inputText, por exemplo: eu digito 30/01/2010 e ele grava 29/01/2010. O que pode ser isso???

Valeu pela ajuda felipe!!!

Eae pessoal, alguem sabe como a fazer o java gravar a data no banco mysql exatamente como digitamos?? no meu caso, se eu digito 07/08/1980, no banco aparece 06/08/1940 20:00:00.

Alguem Sabe como comparar 2 list? eu tenho 2 list distindas com bancos distintos e tenho que sabe qual dos serviços nao batem ou nao foram totalizados…

alguem tem alguma ideia?