Queries case insensitive com Like no Mapper


Hoje eu estava implementando buscas para uma aplicação em Lift 2.0 e queria fazer uma Query com Like.
No Mapper isso pode ser feito da seguinte maneira:

Usuario.findAll(Like(Usuario.nome, "FE%"))

Simples e expressivo não? Essa busca deveria me trazer os usuários cujo nome começa com “Fe”, como Felipe, Fernando, Felícia…
Só que ela não me trouxe nada! Porque eu digitei FE com letra maiúscula na tela… humm… com certeza deve existir um LikeNoCase no Mapper!
Não tem… Mas descobri que o Like na verdade é um builder para a criação de um objeto mais genérico chamado Cmp, que representa uma comparação na minha Query.
Eis a definição da classe Cmp:

final case class Cmp[O<:Mapper[O], T](field: MappedField[T,O], opr: OprEnum.Value, value:Box[T], otherField: Box[MappedField[T, O]], dbFunc: Box[String]) extends QueryParam[O]

A solução então é fazer o seguinte

Usuario.findAll(Cmp(Usuario.nome, OprEnum.Like, Full("FE%"), Empty, Full("UPPER"))

O último argumento informa qual função SQL quero aplicar na coluna que estou comparando. Dessa forma, consigo uma comparação Like Case Insensitive.
O penúltimo parâmetro do construtor do Cmp não tenho idéia do que seja, não tem nada no Scaladoc, que por sinal poderia melhorar muito!

Então é isso, fica aí a dica rápida.

Anúncios