1
resposta

Seleção de Registros usando @Query

Prezados, boa tarde!!

Estou com um pequeno problema de seleção de registros. Tenho uma tabela “Cliente” e outra “Endereço”, Na tabela “Endereco”, eu tenho um campo chamado “principal” tipo boolean. Esse campo se refere se o endereço do cliente e o principal ou não. “1” principal “0” não. Segue das classes.

Cliente

@Entity @Data public class Cliente {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;

private String nome;

@OneToMany @JoinColumn(name = "id_cliente") private List enderecos; }

Endereco

@Entity @Data public class Endereco {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;

private String nome;

private int principal; private String bairro; }

No meu repositório de cliente, estou usando o seguinte select @Query(value = "SELECT c FROM Cliente c JOIN c.enderecos e WHERE e.principal = 1 AND c.id = 1”) public List listaTodos();

Fixei o id do cliente, só para ver o resultado.

Quando o json é retornado, ele me vem com todos os endereços do cliente cadastrado, tanto como (1) ou (0), ele não obedece a query. Peço ajuda de todos, aonde estou errando ou se é possível.

Grato.

1 resposta

Olá Ricardo,

O problema que você está enfrentando é devido ao comportamento do JPA/Hibernate. Quando você faz uma consulta com JOIN e filtra os resultados, o Hibernate ainda carrega todas as entidades relacionadas na memória, mesmo que elas não sejam retornadas pela consulta. No seu caso, mesmo que você esteja filtrando os endereços principais, o Hibernate ainda carrega todos os endereços do cliente na memória.

Uma solução para isso seria usar um DTO (Data Transfer Object). Outra solução seria usar uma consulta nativa SQL, que retornaria exatamente o que você quer, mas você perderia alguns benefícios do JPA/Hibernate, como o mapeamento automático para entidades.

Aqui está um exemplo de como você poderia fazer isso:

@Query(value = "SELECT c.*, e.* FROM Cliente c INNER JOIN Endereco e ON c.id = e.id_cliente WHERE e.principal = 1 AND c.id = 1", nativeQuery = true)
List<Object[]> listaTodos();