1
resposta

Consultas dinâmicas com Specifications

Como faço consultas dinâmicas não usando o OR e sim AND mas somente se o valor da pesquisa não for nulo.

1 resposta

Fala, joão! Tudo bem contigo?

Desculpe a demora em dar um retorno

Essa alteração deve ser feita na Classe RelatorioFuncionarioDinamico trocando o or por and

        List<Funcionario> funcionarios = funcionarioRepository
                .findAll(Specification.where(SpecificationFuncionario.nome(nome))
                .and(SpecificationFuncionario.cpf(cpf))
                .and(SpecificationFuncionario.salario(salario))
                .and(SpecificationFuncionario.dataContratacao(dataContratacao))
                );
        funcionarios.forEach(System.out::println);
    }

Nesse cenário, deverá ter uma atenção ao CPF, pois a condicional and só será aceita se todas as premissas forem verdadeiras.

Como o nome está buscando tudo o que vier antes e depois de uma letra colocada, o salario busca um valor maior que o inserido e a data também busca períodos maiores, veja que o cpf procura o valor exato da pesquisa. Se o cpf inserido não bater com o que está cadastrado no banco, não teremos nenhum retorno, mesmo se o restante dos argumentos estiver corretos!

Espero ter contribuído!

Um abraço e bons estudos