E aí, Manoel! Beleza?
Essa Specification é tipo um padrão de projeto que deixa você fazer umas consultas maneiras com a JPA Criteria API. Basicamente, tu consegue montar tuas buscas baseadas em condições que são definidas na hora que o código tá rodando.
Por exemplo, se tu tem uma entidade chamada Produto
com uns atributos como nome
, descricao
, preco
e categoria
, dá pra criar um Specification pra cada um desses, saca só:
public class ProdutoSpecification {
public static Specification<Produto> nome(String nome) {
return (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.like(root.get("nome"), "%" + nome + "%");
}
public static Specification<Produto> descricao(String descricao) {
return (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.like(root.get("descricao"), "%" + descricao + "%");
}
public static Specification<Produto> preco(BigDecimal preco) {
return (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.equal(root.get("preco"), preco);
}
public static Specification<Produto> categoria(String categoria) {
return (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.equal(root.get("categoria"), categoria);
}
}
E aí, lá na camada de serviço, tu joga essas Specifications no método findAll
do teu repositório, tipo assim:
public List<Produto> buscar(String nome, String descricao, BigDecimal preco, String categoria) {
return produtoRepository.findAll(Specification
.where(nome(nome))
.or(descricao(descricao))
.or(preco(preco))
.or(categoria(categoria)));
}
Olha só, o findAll
vai te trazer todos os produtos que batem com pelo menos uma dessas condições. Se quiser que todos os parâmetros contem na busca, só trocar o .or
por .and
.
Valeu!