Problemas Busca Hibernate

5 respostas
tRuNkSnEt

Olá,

Estou com problemas em buscas feitas com critéria onde um ou mais parametros da busca tenham acento. Estou usando banco de dados PostgreSQL é meu banco tem encode UTF-8. Todos os demais componentes da minha aplicação também usam esse encode.

Quando faço a busca como na Listagem1 o SGDB retorna exatamente 70 registros, porém quando faço a busca usando critéria conforme Listagem2 o hibernate não retorna nenhum registro. Engraçado que o parametro não está com aqueles problemas tipicos de charset (reparem o out.print do parametro).

Alguem tem alguma “Luz” para esse problema? Obrigado!

Listagem1

Listagem2

public List list (String titulo){
		System.out.println("O Titulo da busca é: "+titulo);
		return HibernateUtil.getSession().createCriteria(Materia.class)
					.add(Restrictions.ilike("titulo", '%' + titulo + '%' ))
					.list();
		
	}

        Output: O Titulo da busca é: ROMÁRIO.

5 Respostas

tRuNkSnEt

Para completar o meu desespero veja o codigo abaixo, não deveriam ser identicos?

System.out.println(HibernateUtil.getSession().createSQLQuery("SELECT *  
FROM MATERIA WHERE TITULO ILIKE '%ROMÁRIO%'").list().size());  
// RETORNA 70 REGISTROS  
   
System.out.println(HibernateUtil.getSession().createCriteria(Materia.class)  
.add(Restrictions.ilike("tituto", "%ROMÁRIO%")).list().size());  
// RETORNA 0 REGISTROS

Como que se explica isso? Alguem pode me ajudar? Vlw

L

tenta o seguinte:

public List list (String titulo){   
    System.out.println("O Titulo da busca é: "+titulo);   
    return HibernateUtil.getSession().createCriteria(Materia.class)   
                .add(Restrictions.ilike("titulo", titulo , MatchMode.ANYWHERE ))   
                .list();   
       
}

tive problemas com utf-8 quando estava manipulando arquivos xml… tive q mudar para “ISO-8859-1”

tRuNkSnEt

Infelizmente o MatchMode não resolveu meu problema, porém eu descobri uma outra coisa interessante. Veja só, se eu usar apenas LIKE em vez de ILIKE ele retorna os resultados corretamente, porém pode ocorrer de o usuário editar um mesmo parametro em minusculo e maiusculo dai o LIKE nao resolveria meu problema. No minimo estranho não é? Alguem tem mais alguma opiniao? Situação nova abaixo:

SQLQuery sql = HibernateUtil.getSession()
           .createSQLQuery("SELECT * FROM MATERIA WHERE TITULO LIKE '%ROMÁRIO%'");

Criteria c1 = HibernateUtil.getSession().createCriteria(Materia.class)
					.add(Restrictions.ilike("titulo", "%ROMÁRIO%",MatchMode.ANYWHERE));

Criteria c2 = HibernateUtil.getSession().createCriteria(Materia.class)
		.add(Expression.like("titulo", "%ROMÁRIO%", MatchMode.ANYWHERE));    

System.out.println("sql: (sqlQuery): "+sql.list().size());
System.out.println("c1:  (ilike)   : "+c1.list().size());
System.out.println("c2:  (like)    : "+c2.list().size());

/* OUTPUT
sql: (sqlQuery): 72 Registros
c1:  (ilike)   : 0 Registros
c2:  (like)    : 72 Registros
*/
L

so uma dica… q descobri a poucos minutos…
o Expression está depreciado…
use somente o Restrictions

tRuNkSnEt

lauronolasco:
so uma dica… q descobri a poucos minutos…
o Expression está depreciado…
use somente o Restrictions

Pois é, eu tentei usar os dois mas mesmo assim continua o problema. A nem, será bug no Hibernate? Isso nao pode ser problema de charSet já que LIKE funciona mas ILIKE não funciona. Alias, já é muito estranho Like funcionar mas ILIKE não … Alguem tem alguma ideia?

Criado 12 de fevereiro de 2008
Ultima resposta 13 de fev. de 2008
Respostas 5
Participantes 2