1
resposta

Como realizar uma pesquisa com os parâmetros "acoplados"?

Ok, o exemplo da aula mostrou uma pesquisa em que os parâmetros não "conversam" entre si.

Ou seja, o resultado exibiu "nomes que contém a letra B" OU "salários acima de 6.000".

Mas o mais comum de se ver em pesquisas em qualquer ferramenta é a busca de "nomes que contém a letra B" E "salários acima de 6.000".

Como realizar esse tipo de pesquisa nessa situação?

1 resposta

Olá, Fabiano!

Para realizar uma pesquisa com parâmetros "acoplados", ou seja, que "conversam" entre si, podemos utilizar o recurso de Specifications do Spring Data JPA.

Com as Specifications, é possível criar consultas mais complexas, com diversos critérios que podem ser combinados de diferentes formas.

No seu caso, para buscar "nomes que contém a letra B" E "salários acima de 6.000", podemos criar duas Specifications, uma para cada critério, e combiná-las utilizando o método and().

Segue um exemplo de como ficaria o código:

public static Specification<Funcionario> nomeContemLetraB() {
    return (root, query, builder) -> builder.like(root.get("nome"), "%b%");
}

public static Specification<Funcionario> salarioMaiorQue6000() {
    return (root, query, builder) -> builder.greaterThan(root.get("salario"), 6000);
}

public static Specification<Funcionario> nomeContemLetraBESalarioMaiorQue6000() {
    return nomeContemLetraB().and(salarioMaiorQue6000());
}

No exemplo acima, criamos duas Specifications, uma para buscar nomes que contém a letra "b" e outra para buscar salários maiores que 6.000. Em seguida, criamos uma terceira Specification que combina as duas utilizando o método and().

Para utilizar essa Specification na sua consulta, basta chamar o método findAll() do seu repositório passando a Specification como parâmetro:

List<Funcionario> funcionarios = funcionarioRepository.findAll(nomeContemLetraBESalarioMaiorQue6000());

Espero ter ajudado e bons estudos!