2
respostas

[Dúvida] Busca com ILIKE ANY (ARRAY[]) no quarkus não funciona

Precisava de um código que verificasse certas restrições do sistema, poderia ser mais de uma, para validar o usuário ao acesso que a restrição permite, porém o panache/jpa não permite o ARRAY, acusa erro de semântica

public List<RestrictionEnty> filterByPermissionAndRestrict(String permission, String[] restricts) {
        return find("SELECT r FROM RestrictionEnty where permission = ?1 AND name ILIKE ANY (ARRAY[?2])", permission, Arrays.asList(restricts).stream().map(m -> "'"+ m + "'").collect(Collectors.joining(",")) ).list();
    }

Alguém poderia me dizer um código alternativo a esse, sem ter que colocar um for atribuindo um OR em cada item do array?

2 respostas

Olá, Vinícius, tudo bem?

Desculpe pela demora em obter retorno.

Você pode conseguir um resultado semelhante usando a cláusula IN do SQL.

Aqui está uma sugestão de código:

public List<RestrictionEnty> filterByPermissionAndRestrict(String permission, String[] restricts) {
    String queryString = "SELECT r FROM RestrictionEnty r WHERE r.permission = ?1 AND r.name IN ?2";
    
    TypedQuery<RestrictionEnty> query = entityManager.createQuery(queryString, RestrictionEnty.class);
    query.setParameter(1, permission);
    query.setParameter(2, Arrays.asList(restricts));

    return query.getResultList();
}

Neste exemplo, estamos usando a cláusula IN para verificar se o valor da coluna name está presente na lista de restrições passadas como parâmetro.

Espero que ajude.

Caso surja alguma dúvida, é só compartilhar no fórum.

Abraços e até mais!

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

Sim, o IN funciona, sei disso, é que eu esqueci de um detalhe meio importante hehe, no caso quero saber se tem algum código que corresponde a isso mas usando o % do Ilike, no IN('%valor1%', '%valor2%') não funciona, ele só compara com exatamente os valores que estão ali, no caso de uma query Postgres tem o ILIKE ANY(ARRAY['%valor1%','%valor2%']) assim ele compara como um ilike em cada valor, só que se não fizer com query nativa a JPA não funciona, nem usando o Panache claro, tem o jeito de fazer Iterando um OR em uma string e executando na query, mas só queria saber se tinha alguma forma que encaixa na JPA que se adequa a isso. Não é uma coisa assim de extrema necessidade, é que me deparei com esse problema, resolvi com native query mas bate a curiosidade