1
resposta

Specification ainda considerando campo NULL para condição no SQL

Na aula 06. Consultas Dnâmicas, vídeo 04 Compondo Specifications. No exemplo, meus campos de cpf, salario e dataContratacao estao indo NULL, no entanto ainda está considerando eles no SQL. Código, exatamente como passado:

List<Funcionario> funcionarios = 
                this.funcionarioRepository.findAll(Specification
                        .where(
                            SpecificationFuncionario.nome(nome))
                            .or(SpecificationFuncionario.cpf(cpf))
                            .or(SpecificationFuncionario.salario(salario))
                            .or(SpecificationFuncionario.dataContratacao(dataContratacao))
                        );

SQL que está sendo montado pelo Hibernate:

select
        funcionari0_.id as id1_1_,
        funcionari0_.cargo as cargo6_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_ 
    where
        funcionari0_.nome like ? 
        or funcionari0_.cpf=? 
        or funcionari0_.salario>0 
        or funcionari0_.data_contratacao>?

Assim, se eu pesquisar apenas pelo Nome de algum funcioário, está trazendo todos os registros do banco. Alguma dica de como resolver?

1 resposta

Olá Henrique! Tudo bem?

Pelo que entendi, você está tendo problemas com a composição de Specifications no Spring Data JPA, correto? Mais especificamente, você está tendo problemas com a condição NULL no SQL, certo?

Pelo código que você compartilhou, acredito que o problema esteja na forma como as Specifications estão sendo compostas. Quando você utiliza o método "or" para compor as Specifications, o Spring Data JPA está criando uma cláusula "OR" no SQL, o que pode estar causando a busca por registros que não deveriam ser retornados.

Para resolver esse problema, sugiro que você utilize o método "and" ao invés do método "or" na composição das Specifications. Dessa forma, o Spring Data JPA irá criar uma cláusula "AND" no SQL, o que deve resolver o problema da busca por registros que não deveriam ser retornados.

O código ficaria assim:

List<Funcionario> funcionarios = 
    this.funcionarioRepository.findAll(Specification
        .where(
            SpecificationFuncionario.nome(nome))
            .and(SpecificationFuncionario.cpf(cpf))
            .and(SpecificationFuncionario.salario(salario))
            .and(SpecificationFuncionario.dataContratacao(dataContratacao))
        );

Espero que essa dica te ajude a resolver o problema! Se ainda tiver dúvidas, é só perguntar.

Espero ter ajudado e bons estudos!