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

Olá Guj. Tudo bom?

Galera, tô com um problema.
Seguinte… tenho a consulta abaixo:

[code]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();[/code]
O correto seria gerar a SQL mais ou menos assim:

Mas é gerado assim:

Alguém sabe o que pode ser?
Já tentei (sem sucesso) mudar a linha [4] para:

Valeu galera, abraços.

Alguém?

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!

qual SQL ele gerou para esta instrução?[/quote]

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:

Alguém?

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:

[code] 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 + "’" );

}[/code]

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

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

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.

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!