Bom dia a todos,
uso a dobradinha Hibernate/Firebird para persistência e tenho enfrentado problemas com a geração de código SQL pelo Hibernate.
O código a seguir
list = (List) session.createCriteria(this.getBOClass())
.add(Expression.like(field, "%" + value + "%").ignoreCase()).list();
, onde getBOClass() retorna a classe do POJO, field contém o nome do atributo e value o valor a ser buscado, gera um erro, conforme o log do JBoss abaixo:
10:36:17,718 INFO [STDOUT] Hibernate: select this_.EVEM_TOPICO_CODIGO as EVEM1_69_0_, this_.EVEM_TOPICO_DESCRICAO as EVEM3_69_0_, this_.EVEM_TOPICO_CONCLUSAO as EVEM2_69_0_ from EVEM_TOPICO this_ where lower(this_.EVEM_TOPICO_DESCRICAO) like ?
10:36:17,781 WARN [JDBCExceptionReporter] SQL Error: 335544569, SQLState: HY000
10:36:17,781 ERROR [JDBCExceptionReporter] GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -804
Function unknown
LOWER
O problema reside na fato de o Hibernate tentar aplicar uma função não suportada pelo Firebird. Não conheço bem a arquitetura do Hibernate, mas isto me parece ser um bug, pois se é informado ao Hibernate o SGBD sendo utilizado, as especificidades deveriam ser tratadas. No caso do Firebird, o operador CONTAINING seria ideal para o caso, funcionando inclusive para BLOBs (a função UPPER, por exemplo, que eu poderia forçar através de código HQL, não é suportada para BLOBs).
Gostaria de saber se é possível customizar a geração de SQL de modo que referências a ignoreCase fossem remetidas ao operador CONTAINING em lugar da função LOWER.