Digamos que eu tenha um banco de dados de nomes. Qual comando JPQL eu poderia usar para que quando pesquisasse um nome “julio” ele me entregasse todos os nomes não só com “julio”, mas também com os de letras maisúsculas(Julio, jULio…), ou até com acentos(Júlio). Como poderia fazer isso?
Boa noite,
No caso SELECT * FROM cliente WHERE nome ~ ‘Julio’;*
O “~*” ignora o case sensitive;
eu to usando esse código: select p from Article p where p.title like %?1%
-onde devo colocar ess “~”?
O ~*
é exclusivo do PostgreSQL, não funciona em outros bancos (Oracle e MySQL, por exemplo, não suportam este operador).
Em JPQL teria que converter tudo para minúsculas ou maiúsculas, algo assim:
select p from Article p where lower(p.title) like lower(concat('%', ?1,'%'))
Já para ignorar os acentos, é mais complicado e depende do banco de dados que está usando (assumindo que são os valores do banco que possuem acentos).
Vale lembrar que isso pode trazer vários falso-positivos. Por exemplo, “sábia”, “sabia” e “sabiá” são palavras diferentes, mas se ignorar os acentos elas seriam consideradas iguais. É isso mesmo que você quer?
Muito obrigado. E obrigado por clarear as minhas ideias também. Realmente eu não quero ignorar os acentos. Percebi o problema depois que você explicou
Como utilizador, quando eu estou a efetuar uma pesquisa, normalmente espero que os acentos sejam ignorados e sim, pesquisando por qualquer dessas palavras o resultado seja o mesmo. Mas sempre depende do contexto.
Alerto ainda para o facto de que ao fazer a query com lower de ambos os lados, a utilização de indexes não vai ocorrer, a não ser que o index tenha sido criado já com a lower e não diretamente sobre a coluna.
Sim, sempre depende. Por isso eu perguntei se era isso mesmo que ele queria fazer
Muito bem lembrado