[RESOLVIDO] Hibernate: Consulta usando Criteria gera SQL com "like ?"

7 respostas
L

Olá Guj. Tudo bom?

Galera, tô com um problema. Seguinte.. tenho a consulta abaixo:
String parametro = request.getParameter("parametro");
	
Criteria criteria = sessao.createCriteria(Item.class); 
criteria.add(Restrictions.like("titulo", "%"+parametro+"%"));
criteria.addOrder(Order.asc("titulo"));
List<Item> listResultadoItem = criteria.list();
O correto seria gerar a SQL mais ou menos assim:
select * from item where titulo like '%meu_parametro%' order by titulo asc
Mas é gerado assim:
select * from item where titulo like ? order by titulo asc
Alguém sabe o que pode ser? Já tentei (sem sucesso) mudar a linha [4] para:
criteria.add(Restrictions.like("titulo",parametro,MatchMode.ANYWHERE));

Valeu galera, abraços.

7 Respostas

L

Alguém?

F

qual SQL ele gerou para esta instrução?

uma dica seria você utilizar ilike, mas falando do seu problema, eu geralmente utilizo parametros nomeados, ou seja, utilizando por exemplo:

resumindo um pouco da mesma idéia discutida nesta thread no forum do hibernate.

espero que consiga! :wink:

editado: ajuste do critéria informado!

L

qual SQL ele gerou para esta instrução?

Ele gerou a mesma coisa:

Mas a diferença do like pro ilike não é simplesmente o case-sensitive???

[quote=faelcavalcanti]mas falando do seu problema, eu geralmente utilizo parametros nomeados, ou seja, utilizando por exemplo:

Não entendi :frowning:

Editado: Obrigado pela força e pela atenção :slight_smile:

L

Alguém?

L

Galera,

Como eu não conseguia resolver meu problema, comecei a analizar o código-fonte do Hibernate. Encontrei na classe LikeExpression o seguinte método:
public String toSqlString(
			Criteria criteria,
			CriteriaQuery criteriaQuery) throws HibernateException {
		Dialect dialect = criteriaQuery.getFactory().getDialect();
		String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, propertyName );
		if ( columns.length != 1 ) {
			throw new HibernateException( "Like may only be used with single-column properties" );
		}
		String lhs = ignoreCase
				? dialect.getLowercaseFunction() + '(' + columns[0] + ')'
	            : columns[0];
		return lhs + " like ?" + ( escapeChar == null ? "" : " escape \'" + escapeChar + "\'" );

	}

Reparem que na linha 12, ele - de fato - inclui a string " like ?".

Alguém pode me ajudar?
Obrigado desde já.

L

Galera, problema resolvido.

Notei que a consulta está sendo realizada corretamente, a única coisa que está errada é a SQL que ele “diz que cria”. Ou seja, ele mostra que está executando “select * from tabela where ?”, onde na verdade está realizando “select * from tabela where campo=‘parametro’”.

Estranho, não?! Bom, acredito que o Hibernate tenha algum motivo pra não poder/conseguir exibir a SQL correta, mas pelo menos realizara corretamente a consulta.

L

Bom, pra fechar esse post:

Ontem foi esclarecido por um amigo (Thiago Aléssio), que o Hibernate faz isso pra demonstrar que evitará SQL Injection. Ou seja, onde tem o ? entrará o parametro passado, do qual o Hibernate cuidará pra que não haja SQL Injection, facilitando a vida do programador.

É isso aí galera. Valeu!

Criado 27 de setembro de 2008
Ultima resposta 7 de out. de 2008
Respostas 7
Participantes 2