Olá Kleber, Parabéns pelo curso, excelente didática.
Ao ver os exemplos de classes @Service e Specification para geração de queries dinâmicas, fiquei com quatro dúvidas, com indicado abaixo:
1) Os exemplos de injeção de dependências não poderiam ser feitas com a anotação @Autowired ? tanto na @Service quanto na Specification, algo como:
@Autowired private final FuncionarioRepository funcionarioRepository;
2) Nos Exemplos de @Native Query não podemos fazer algo semelhante a queries dinâmicas usando um Specification? sendo algo parecido com:
@Query(value="SELECT f Funcionarios WHERE f.nome LIKE '%:valorNomeDigitado%'", NativeQuery=true);
3) No caso da Native Query e Queries Dinâmicas (uso do Specification), para tomar uma atitude de se evitar o uso de SQLInjection por parte de um Frontend ou chamada à classe de consulta, considerando um valor da variável informada pelo usuário da aplicação como "DROP TABLE Funcionarios" ou outra pseudo-query que pudesse provocar dano ao banco e ao sistema. Como podemos impedir o SQL Injection? Seria criar um método para tratar a variável de entrada? ou o SpringBoot faria isso automaticamente?
4) Imagine que precisamos recuperar dados de tabelas com relacionamentos complexos do legado, onde essas tabelas e relacionamentos certamente não são nada triviais. Naturalmente a performance do Native Query é melhor que as demais? e quanto a interação com o legado complexo, o Native Query seria a melhor opção ou teríamos que pular diretamente para o JDBC?
Atenciosamente, Geovane Lemos