1
resposta

consulta ao BD por parâmetros opcionais

Utilizando spring data, como seria possível realizar uma consulta ao BD por parâmetros opcionais ?

Por exemplo, uma consulta de funcionários por nome, cpf e salario maior onde o usuário poderia informar nenhum (pesquisaria sem parametros), um parametro (se preencher nome, pesquisa por nome, cpf por cpf, ...), dois parametros (poderia preencher nome + cpf ou nome + salario maior ou cpf + salario maior) ou mesmo os três parametros.

1 resposta

Opa!!!! Tudo bom grande Francisco? Essa sua dúvida é algo que realmente acontece no dia a dia da gente, lá estamos criando um formulário que vai ter uns 10 campos e nenhum é obrigatório? No exemplo do curso como está sendo usado o operador "OR" não tem nenhum problema, mas no caso se fosse o "AND" ai chegaria na consulta o valor "NULL" e nos estariamos em apuros. A modificação que eu fiz foi a seguinte:

public class SpecificationFuncionario {

public static Specification<Funcionario> nome(String nome) {
    return (root, criteriaQuery, criteriaBuilder) -> nome == null ? null
            : criteriaBuilder.like(root.get("nome"), "%" + nome + "%");
}

public static Specification<Funcionario> cpf(String cpf) {
    return (root, criteriaQuery, criteriaBuilder) -> cpf == null ? null
            : criteriaBuilder.equal(root.get("cpf"), cpf);
}

public static Specification<Funcionario> salario(Double salario) {
    return (root, criteriaQuery, criteriaBuilder) -> salario == null ? null
            : criteriaBuilder.greaterThan(root.get("salario"), salario);
}

public static Specification<Funcionario> dataContratacao(LocalDate dataContratacao) {
    return (root, criteriaQuery, criteriaBuilder) -> dataContratacao == null ? null
            : criteriaBuilder.greaterThan(root.get("dataContratacao"), dataContratacao);
}

}

Se o valor vem "NULL" basta retornar no "NULL" se tem um valor diferente de "NULL" ai a gente faz a paradinha do criteriaBuilder.etc.etc.etc("algumacoisa");

Faz essa modificação no teu .properties ai também, ai tu consegue ver direitinho o SQL que tá sendo gerado, ai tu vai ver que se o valor chegar null ele nem aparece na consulta. spring.jpa.show-sql=true

No caso se tu passar todos os valores "NULL" que é quando você não quer filtrar por nada o resultado vai ser o seguinte: select funcionari0_.id as id1_1_, funcionari0_.cargo_id as cargo_id6_1_, funcionari0_.cpf as cpf2_1_, funcionari0_.data_contratacao as data_con3_1_, funcionari0_.nome as nome4_1_, funcionari0_.salario as salario5_1_ from funcionarios funcionari0_

OBS: Só lembrando que o double tem que ser "0" e não "NULL"

Espero ter ajudado e que a força esteja com você!!!!!