Executando verificação de segurança...
1

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!

Carregando publicação patrocinada...