Dto com várias tabelas

10 respostas
phpspringjavaspring-boot
Try

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?

10 Respostas

Lucas_Camara

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);
}
Try

Seguindo este exemplo, se a consulta tivesse que retornar além dos dados de pessoas uma lista de endereço que está pessoa tem.

Try

Estás informações vem pelos mapeamento das chaves estrangeiras das classe. Refiz em cascata e .EAGER

P

no caso de trabalhar com Service e Controller, como eu retornaria esta interface?

Lucas_Camara

Nesse caso, o service chamaria o repository que devolveria a interface.

Controller → Service → Repository

Lucas_Camara

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.

P

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.

staroski
public ISocio findByCpf(String cpf) {
	return socioRepository.findByCpf(cpf);
}
Lucas_Camara

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

P

muito obrigado!

com as dicas de vocês, retornou de acordo com o que queria.

Vlww!!

Criado 13 de maio de 2023
Ultima resposta 19 de mai. de 2023
Respostas 10
Participantes 4