Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Sugestão] Sobre o ILIKE

Olá a todos,

Apenas um aviso sobre o uso do comando ILIKE no JPQL. Ele não é um recurso padrão do JPQL, então só funcionará em bancos de dados que o suportam nativamente. Bons exemplos são PostgreSQL e Snowflake, entre outros.

No entanto, alguns bancos de dados populares, como MySQL e SQL Server, não suportam o ILIKE. Isso significa que, se você estiver trabalhando com eles, suas consultas não serão executadas como esperado.

Portanto, é muito útil aprender a fazer correspondências semelhantes que ignoram maiúsculas e minúsculas de uma forma que funcione em todos os bancos de dados, independentemente do suporte a comandos específicos. Isso ajudará a garantir que seu código seja mais portátil e robusto.

Eu fiz o seguinte:

@Query("SELECT e FROM Serie s JOIN s.episodios e WHERE LOWER(e.titulo) LIKE CONCAT('%',LOWER(:trechoEpisodio),'%')")
    List<Episodio> episodiosPorTecho(String trechoEpisodio);

Como o comando LIKE é case-sensitive precisamos usar o LOWER para poder comparar as duas strings, a parte do CONCAT é essencial pois primeiro colocando o trechoEpisodio em lower case e depois concatenamos com os caracteres curingas.

Outra alternativa seria tratarmos antes de chamar a funcão. Então ficaria algo como:

...
List<Episodio> episodiosEncontrados = repositorio.episodiosPorTecho(trechoEpisodio.toLowerCase());
...
@Query("SELECT e FROM Serie s JOIN s.episodios e WHERE LOWER(e.titulo) LIKE %:trechoEpisodio%")
    List<Episodio> episodiosPorTecho(String trechoEpisodio);
1 resposta
solução!

Olá Klinsmann! Como vai?

Você trouxe um ponto muito importante sobre o uso do ILIKE no JPQL e sua compatibilidade com diferentes bancos de dados.

De fato, o ILIKE é uma extensão que não faz parte do padrão JPQL e, portanto, não é suportada por todos os bancos de dados. Como você mencionou, ele funciona bem em bancos como PostgreSQL e Snowflake, mas não em outros como MySQL e SQL Server.

A solução que você propôs usando LOWER e LIKE é uma excelente alternativa para garantir que suas consultas sejam case-insensitive e funcionem em qualquer banco de dados. Ao converter tanto o campo quanto o parâmetro de busca para minúsculas, você efetivamente simula o comportamento do ILIKE, tornando seu código mais portátil e robusto.

Além disso, sua abordagem de tratar a string antes de passá-la para a consulta é uma prática recomendada, pois delega a responsabilidade de formatação para a camada de serviço, deixando a consulta mais limpa e focada.

Aqui está um exemplo prático do que você fez:

@Query("SELECT e FROM Serie s JOIN s.episodios e WHERE LOWER(e.titulo) LIKE CONCAT('%',LOWER(:trechoEpisodio),'%')")
List<Episodio> episodiosPorTecho(String trechoEpisodio);

E a alternativa:

List<Episodio> episodiosEncontrados = repositorio.episodiosPorTecho(trechoEpisodio.toLowerCase());

Ambas as abordagens são válidas e ajudam a garantir que suas consultas sejam executadas corretamente, independentemente do banco de dados subjacente.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.