Pra mim o hibernate não está aceitando parâmetros null na query. Será alguma coisa que não estou vendo ou alguma diferença entre as versões das dependências?
@Service
public class RelatorioFuncionarioDinamico {
private final FuncionarioRepository funcionarioRepository;
private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
public RelatorioFuncionarioDinamico(FuncionarioRepository funcionarioRepository) {
this.funcionarioRepository = funcionarioRepository;
}
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 salário");
Double salario = scanner.nextDouble();
if (salario == 0) {
salario = null;
}
System.out.println("Digite uma data");
String strDate = scanner.next();
LocalDate dataContratacao;
if (strDate.equalsIgnoreCase("NULL")) {
dataContratacao = null;
} else {
dataContratacao = LocalDate.parse(strDate, formatter);
}
List<Funcionario> funcionarios = funcionarioRepository
.findAll(Specification.where(SpecificationFunctionario.nome(nome))
.or(SpecificationFunctionario.cpf(cpf))
.or(SpecificationFunctionario.salario(salario))
.or(SpecificationFunctionario.dataContratacao(dataContratacao)));
funcionarios.forEach(System.out::println);
}
}
public class SpecificationFunctionario {
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(Double 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);
}
}