Caros, as minhas Query de repository sempre vai para um map de string obcjet . E depois tenho que fazer um converte. Existe algum maneira mais fácil de receber todas as tabelas dos join de consulta em um dto, a te mesmo lista de outros objetos?
Imagino que vc está executando uma consulta nativa. Já usei uma abordagem usando interface que ficou muito simples:
IPessoa
public interface IPessoa {
String getNome();
String getSobrenome();
}
PessoaRepository
public interface PessoaRepository extends JpaRepository<Pessoa, Long> {
@Query(value = "SELECT p.nome as nome, p.sobrenome as sobrenome FROM Pessoa p WHERE id = :id", nativeQuery = true)
IPessoa findPessoaById(Long id);
}
Seguindo este exemplo, se a consulta tivesse que retornar além dos dados de pessoas uma lista de endereço que está pessoa tem.
Estás informações vem pelos mapeamento das chaves estrangeiras das classe. Refiz em cascata e .EAGER
no caso de trabalhar com Service e Controller, como eu retornaria esta interface?
Nesse caso, o service chamaria o repository que devolveria a interface.
Controller → Service → Repository
Pq não aceita?
Como vc implementou esse ISocio
?
O método findByCpf
retorna um IPessoa
?
Qual a relação entre IPessoa
e ISocio
?
Como esse ISocio
provavelmente é uma interface
, vc não conseguirá instanciar usando o new da forma como vc está fazendo.
Sempre que algo não der certo, sempre poste o pq não deu certo, e em caso de erro, poste o erro que aconteceu.
boa tarde. eu não estava com o código, e na “pressa” postei oq lembrava…
ISocio:
public interface ISocio {
String getId();
String getEmpresaId();
}
Repository:
@Query(nativeQuery = true, value = "SELECT id, empresa_id FROM tb_pessoal_socios WHERE cpf = (:cpf)")
ISocio findByCpf(String cpf);
Service:
public ISocio findByCpf(String cpf) {
return new ISocio(socioRepository.findByCpf(cpf));
}
Controller:
@GetMapping(value = "/cpf/{cpf}")
public ResponseEntity<ISocio> findByCpf(@PathVariable String cpf) {
return ResponseEntity.ok().body(socioService.findByCpf(cpf));
}
Pelo que entendi, devido a ser uma interface, não posso instânciar como a classe, porém não consegui entender a forma correta de utilizar.
public ISocio findByCpf(String cpf) {
return socioRepository.findByCpf(cpf);
}
Depois de ajustar conforme postado pelo @staroski, vc tb precisa ajustar a consulta no repositório:
@Query(
value = "SELECT id AS id, empresa_id AS empresaId FROM tb_pessoal_socios WHERE cpf = :cpf",
nativeQuery = true
)
ISocio findByCpf(String cpf);
É preciso adicionar os alias nas colunas retornadas para ficar de acordo com a interface ISocio
.
Capaz que para o
id
não precisa de alias, apenas coloquei por mania mesmo kkk
muito obrigado!
com as dicas de vocês, retornou de acordo com o que queria.
Vlww!!