Dto com várias tabelas

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.

1 curtida

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.

1 curtida
public ISocio findByCpf(String cpf) {
	return socioRepository.findByCpf(cpf);
}
2 curtidas

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

1 curtida

muito obrigado!

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

Vlww!!