Sua segunda solução ficou bem melhor do que a primeira, apesar da query ficar dificil de ler, como vc destacou.
De qualquer forma, como vc esta usando Spring Data, pode usar o Query by Example. Vc pode ler mais no link abaixo.
https://docs.spring.io/spring-data/jpa/reference/repositories/query-by-example.html
E este é um exemplo bem básico de como ficaria.
@Getter
@Setter
@Entity
@Table(name = "empresa")
class ParceiroEntity {
@Id
@Column(length = 14, nullable = false)
private String cpf;
@Column(length = 255, nullable = false)
private String nome;
@Column(length = 255, nullable = false)
private String estado;
@Column(length = 2, nullable = false)
private String uf;
@Column(nullable = false)
private Integer numeroFuncionarios;
@Column(nullable = false)
private Integer qtdFiliais;
}
@Getter
@Setter
class ParceiroRequestParams {
private String cpf;
private String nome;
private String estado;
private Integer numero;
}
interface ParceiroRepository extends JpaRepository<ParceiroEntity, String> {
}
@RestController
class ParceirosController {
@Autowired
private ParceiroRepository repository;
@GetMapping("/parceiros")
List<ParceiroEntity> getParceiros(ParceiroRequestParams params) {
var matcher = ExampleMatcher
.matching()
.withStringMatcher(StringMatcher.CONTAINING)
.withIgnoreNullValues();
var entity = new ParceiroEntity();
entity.setCpf(params.getCpf());
entity.setNome(params.getNome());
entity.setEstado(params.getEstado());
entity.setNumeroFuncionarios(params.getNumero());
var example = Example.of(entity, matcher);
return repository.findAll(example);
}
}
A JpaRepository
já estende a QueryByExampleExecutor
, então não precisamos fazer nenhuma alteração no nosso repository.
Basicamente, como o nome da funcionalidade sugere, a gente cria um exemplo de entidade que queremos trazer do banco.
Funciona bastante bem para vários casos, e é perfeito para este cenário que vc apresentou.
Outra opção é usar as specifications. Veja mais aqui:
https://docs.spring.io/spring-data/jpa/reference/jpa/specifications.html
Apesar de mais complexas, specifications são bastante poderosas!