[Resolvido] Problema no uso da Criteria com Date

5 respostas
Kleber-rr
Olá pessoal, estou tentando fazer uma criteria da seguinte forma: Dao
@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();
	}
Bean
public List<Audiencia> getBuscaAudiencia() {
		Session session = HibernateUtil.currentSession();
		AudienciaDAO audienciaDao = new AudienciaDAO(session, Audiencia.class);
		List<Audiencia> lista = audienciaDao.pesquisaAudiencias(this.audiencia
				.getData_audiencia(), this.audiencia.getData_peticao(),
				this.audiencia.getAnotacoes(), this.audiencia.getProcesso());
		return lista;
	}[/code

 que ele está me retornando 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: java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date
	at org.hibernate.type.TimestampType.toString(TimestampType.java:55)
	at org.hibernate.type.NullableType.nullSafeToString(NullableType.java:93)
	at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:140)
	at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:116)
	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:76)
	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

Eu sei que minha criteria está errada, e que o erro está informando que não pode fazer cast de string para Date... como eu poderia corrigir isso??

Agradeço a ajuda!!

5 Respostas

A

Cara, acredito que o erro é esse"%" qe você colocou antes e depois da data,

Retire o “%”, ficando:

Do jeito que você fez, a data foi convertida para string, pois foi contatenada com uma string.

Qq coisa posta ae.

Kleber-rr

[quote=analistajava]Cara, acredito que o erro é esse"%" qe você colocou antes e depois da data,

Retire o “%”, ficando:

Do jeito que você fez, a data foi convertida para string, pois foi contatenada com uma string.

Qq coisa posta ae.[/quote

Valeu analista, agora entendi o “pq” do %…

Fiz a alteração sugerida, e o erro agora é esse:

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)

A

Acho que o problema é o mesmo cara, só que em outro campo… esse processo que você está colocando no Criteria, ele é um campo Long? Se for, tira o “%” dele também.

Lembre-se que o “%” é um caracter curinga para buscas em campos texto no banco de dados. Você não postou o stacktrace completo, mas um pouco mais abaixo no stacktrace deve conter a linha que o erro ocorreu.

Como você está apredendo a usar o framework, coloque uma linha de cada vez de busca no criteria, para ir vendo os resultados, assim você vai conseguir identificar a linha com problema com mais facilidade.

Qq dúvida posta ae.

Kleber-rr
Resolvido, da seguinte forma:
@SuppressWarnings("unchecked")
	public List<Audiencia> pesquisaAudiencias(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.addOrder(Order.asc("data_audiencia"));

		return c.list();
	}

Eu estava tendo problemas em converter a Data para String, então usei a classe DateUtils e a Restrictions.between, aí funcionou.

Agradeço!!

gabrieljah

Estou com o mesmo problema!
poderia postar essa Classe DateUtils?

Criado 31 de janeiro de 2010
Ultima resposta 12 de jul. de 2012
Respostas 5
Participantes 3