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

def first = “Hello world!”

Atualmente trabalho com Java e tenho que dizer que estou ficando cansado de tanta verbosidade. Um dia desse ouvi falar de um tal de Scala… Curioso que sou, fui ver qual é que é.

Bom, tenho que dizer que Scala é massa pra cacete. E alguns frameworks construidos sobre essa linguagem, como Lift, Akka e Squeryl me deixaram bem impressionados.

Não é uma linguagem fácil, o que torna as coisas mais interessantes. Mas também não é difícil.

Como tenho memória de peixe, fiz esse blog para escrever algumas coisas que fui (e ainda vou) descobrindo. Como o Google é a fonte primária de respostas para muitas pessoas, talvez esse blog venha a ajudar alguém um dia.

Vai saber.