Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Especification não funciona mais no método FindAll?

Estava no meu projeto tranquilamente, até que quando fui usar o specification no findAll... o método simplesmente não da mais a opção para passarmos como parâmetro uma "Specification", como aparece para o professor no curso.

Fui dar uma procurada no JavaDoc do SpringData e encontrei o mesmo, o método FindAll (tanto da interface CrudRepository, quanto da interface PagingAndSortingRepository) não possuem mais esta opção para fazer as consultas dinâmicas...

Seguem abaixo prints:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade Seguem os links para pesquisa caso necessário: https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/PagingAndSortingRepository.html https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html

Estou correto quanto a minha afirmação acima de que as Specifications não funcionam mais da mesma forma ou estou com um problema no meu projeto?

Desde já, agradeço pela ajuda!

2 respostas
solução!

Olá Lorenzo, tudo bem?

Na verdade, o método findAll() ainda aceita uma Specification como parâmetro para consultas dinâmicas no Spring Data JPA. A classe Specification é parte do módulo Spring Data JPA, e é utilizada para definir critérios de busca dinâmicos.

https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html

Você pode criar uma especificação para buscar os registros que atendem a determinados critérios e, em seguida, passá-la como parâmetro para o método findAll(). Para isso, você precisa usar a classe Specification (onde T é o tipo da entidade que você está consultando) e a interface JpaSpecificationExecutor, que estende a interface CrudRepository<T, ID> ou PagingAndSortingRepository<T, ID> para habilitar as consultas com especificação. Exemplo:

import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

public interface PessoaRepository extends JpaRepository<Pessoa, Long>, JpaSpecificationExecutor<Pessoa> {

}

// usando a especificação
public List<Pessoa> findAllByNomeAndIdade(String nome, Integer idade) {
    Specification<Pessoa> spec = Specification.where(null);
    if (nome != null) {
        spec = spec.and((root, query, builder) -> builder.like(root.get("nome"), "%" + nome + "%"));
    }
    if (idade != null) {
        spec = spec.and((root, query, builder) -> builder.equal(root.get("idade"), idade));
    }
    return pessoaRepository.findAll(spec);
}

Observe que o método findAllByNomeAndIdade() usa a Specification para construir uma consulta dinâmica, que pode filtrar registros com base no nome e/ou idade. A Specification é criada com a ajuda do objeto builder, que é fornecido pelo JPA Criteria API. Em seguida, a Specification é passada como parâmetro para o método findAll() do repositório.

Certifique-se de importar as classes necessárias e estender a interface JpaSpecificationExecutor em seu repositório para habilitar a consulta dinâmica com especificação.

Certo, entendi o porquê da minha Specification não estar funcionando, esqueci de extender a classe JpaSpecificationExecutor no meu repositório de Funcionários, logo pensei que o método passando o parâmetro com a Specification tinha sido depreciado e existia uma nova forma de fazer...

Obrigado pela resposta!