2
respostas

Ta me retornando todos os dados

Gente o meu ta retornando sempre todos os dados

package br.com.alura.spring.data.specification;

import java.math.BigDecimal; import java.time.LocalDate;

import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root;

import org.springframework.data.jpa.domain.Specification;

import br.com.alura.spring.data.orm.Funcionario;

public class SpecificationFuncionario {

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

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

public static Specification<Funcionario>salario(BigDecimal salario){
    return(root,criteriaQuery, criteriaBuilder) -> 
            criteriaBuilder.greaterThan(root.get("salario"), salario);
}

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

}

public void inicial(Scanner scanner) { System.out.println("Digite um nome"); String nome = scanner.next();

    if(nome.equalsIgnoreCase("NULL")) {
        nome = null;
    }

    System.out.println("Digite um cpf");
    String cpf = scanner.next();

    if(cpf.equalsIgnoreCase("NULL")) {
        cpf = null;
    }

    System.out.println("Digite um salario");
    String salario = scanner.next();
    BigDecimal salarioFinal = new BigDecimal(salario);

    if(salarioFinal.equals("0")) {
        salarioFinal = null;
    }

    System.out.println("Digite a Data de Contratacao");
    String data = scanner.next();
    LocalDate dataContratacao;

    if(data.equals("NULL")) {
        dataContratacao = null;
    }else {
        dataContratacao = LocalDate.parse(data, formmatter);
    }


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

    funcionarios.forEach(System.out::println);
}

}

2 respostas

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Olá Bruno, tudo bem? Pelo que entendi, você está tendo problemas com o retorno de todos os dados em seu código. Uma possível solução seria verificar se os parâmetros que você está passando para as especificações estão corretos e se não há nenhum erro de digitação. Além disso, é importante lembrar que as especificações são utilizadas para filtrar os dados de acordo com as condições que você definiu.

Uma sugestão seria utilizar o método "and" ao invés do "or" na linha de código em que você está passando as especificações. Dessa forma, o resultado será filtrado de acordo com todas as condições que você definiu.

Por exemplo:

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

Espero ter ajudado e bons estudos!