Quando altero a interface FuncionarioRepository para extender de CrudRepository para PagingAndSortingRepository os métodos save(), findById(id); getReferenceById(id); param de funcionar.
Alterando para JpaRepository os métodos funcionam e a paginação e ordenação também funcionam. Está certo isso?
Interface FuncionarioRepository
@Repository
public interface FuncionarioRepository extends JpaRepository<Funcionario, Integer> {
List<Funcionario> findByNome(String nome);
@Query("SELECT f FROM Funcionario f "
+ "WHERE f.nome = :nome "
+ "AND f.salario >= :salario "
+ "AND f.dataContratacao = :data")
List<Funcionario> buscarNomeContratacaoEsalarioMaior(String nome, Double salario, LocalDate data);
//buscar funcionario pela descricao do cargo
List<Funcionario> findByCargoDescricao(String descricao);
List<Funcionario> findByUnidadeTrabalhos_Descricao(String descricao);
/**
* é equivalente ao método de cima, mudei o nome para diferenciar um do outro
**/
@Query("SELECT f FROM Funcionario f JOIN f.unidadeTrabalhos u WHERE u.descricao = :descricao")
List<Funcionario> findByUnidadeTrabalhos_ (String descricao);
@Query(value = "SELECT * FROM tb_funcionarios f WHERE f.data_contratacao >= :data ", nativeQuery = true)
List<Funcionario> findDataContratacaoMaior(LocalDate data);
}
Classe CrudFuncionarioService
@Service
public class CrudFuncionarioService {
private final FuncionarioRepository funcionarioRepository;
private final CargoRepository cargoRepository;
private final UnidadeTrabalhoRepository unidadeTrabalhoRepository;
private Boolean system= true;
private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
public CrudFuncionarioService(FuncionarioRepository funcionarioRepository, CargoRepository cargoRepository, UnidadeTrabalhoRepository unidadeTrabalhoRepository) {
this.funcionarioRepository = funcionarioRepository;
this.cargoRepository = cargoRepository;
this.unidadeTrabalhoRepository = unidadeTrabalhoRepository;
}
private void visualizar(Scanner scanner) {
System.out.println("Informe a pagina");
int page = scanner.nextInt();
//sem ordenação
//Pageable pageable = PageRequest.of(page, 10, Sort.unsorted());
//ordenação crescente por nome
Pageable pageable = PageRequest.of(page, 10, Sort.by(Sort.Direction.ASC, "nome"));
Page<Funcionario> funcionarios = funcionarioRepository.findAll(pageable);
System.out.println("Número de pag. "+funcionarios);
System.out.println("Pag "+ funcionarios.getNumber());//pag naquele momento
System.out.println("Total de "+ funcionarios.getTotalElements()+ " elementos");
funcionarios.forEach(f -> System.out.println(f));
}
private void salvar(Scanner scanner) {
System.out.println("Informe o nome do Funcionario");
String nome = scanner.next();
System.out.println("Informe o CPF do Funcionario");
String cpf = scanner.next();
System.out.println("Informe o Salario do Funcionario");
Double salario = scanner.nextDouble();
System.out.println("Informe o Data de Contratacao do Funcionario");
String dataContratacao = scanner.next();
System.out.println("Informe o ID do cargo do Funcionario");
Integer cargoId = scanner.nextInt();
List<UnidadeTrabalho> unidades = unidade(scanner);
Funcionario func = new Funcionario();
func.setNome(nome);
func.setCpf(cpf);
func.setSalario(salario);
func.setDataContratacao(LocalDate.parse(dataContratacao, formatter));
Optional<Cargo> cargo = cargoRepository.findById(cargoId);
func.setCargo(cargo.get());
func.setUnidadeTrabalhos(unidades);
funcionarioRepository.save(func);
}
}
Obs. tive que encolher a classe porque ultrapassou a quantidade de caracteres.