Especificar campos no @ManyToOne

12 respostas
R

pessoal,
tenho um objeto Comanda que tem um @ManyToOne Cliente, no momento que eu carrego a Comanda, ele carrega também o cliente, óbvio, está certo isto, mas eu gostaria que carregasse somente o ID e o Nome do cliente, e não todos os campos,
como faço isto?

Obrigado a todos

12 Respostas

Hebert_Coelho

Nao tem como. Uma vez que você carrega uma classe, ele irá trazer todos atributos dela e os relacionamento que estiverem com EAGER.

R

Putz, não acredito…

Hebert_Coelho

Cara, quando um relacionamento é carregado ele fazer um select na tabela de relacionamento.

Qual a diferente entre ele fazer select nome,cpf,idade from cliente de select nome from cliente?

O gasto de memória com conexão já está feito.

R

depende muito amigo
depende da quantidade de campo, dos valores deste campo
a conexão está feita, mas levantar os dados, trafegar pra lá e pra cá, também custa

Hebert_Coelho

Tudo bem, mas quantos atributos tem a classe? :shock:

Se ela for grande, aí sim.

Outra coisa, se ela tiver muitos relacionamento EAGER aí sim tu ta lascado. Vai quer q fazer uma namedQuery.

R

Me explique isto, por favor

Hebert_Coelho
Se você tem uma classe como a classe abaixo:
public void Pessoa{
    private String nome;
    private String cpf;
    private String cidade;
    private String estado;
    private String pais;
}

Você carrega ela numa boa. Pois são campos que pertencem a ela.

Agora se sua classe tem os campos:

public void Pessoa{
    private String nome;
    private String cpf;
    @ManyToOne
    private Cidade cidade;
    @ManyToOne
    private Estado estado;
    @ManyToOne
    private Pais pais;
    
    @OneToMany(EAGER)
    private Cachorros dogs;
}

note que agora alem de carregar a classe pessoa você está carregando a moçada que vem com ela.

Entao, se você fizer o select na classe carro

Carro{
private Pessoa pessoa;
}

Alémde trazer pessoa, vc vai trazer todas as outras classes juntas.

Com isso, teria que colocar as classes do relacionamento como LAZY. Aí sim, vc nao trairia todo mundo mundo.

Espero que dê para entender.

R

aaaaa, lazyloading, eu não sabia que chamava-se namedQuery
hahahaaha
desculpa ae amigo

vlw pela explicação

Hebert_Coelho

Calmae, a idéia é o lazyloading.

namedQuery é uma consulta ao banco de dados, onde caso suas entidades estejam nas classes como EAGER, você faria a consulta (através da namedQuery para buscar a classe sem o EAGER).

R

mano, agora vc me confundiu, hahahaha
me dê um exemplo de namedQuery por favor.

Hebert_Coelho

@NamedQuery(name = "buscarOrcamentoCarrandoEagerFreelancer", query = "select o from Orcamento o left join fetch o.freelancer f left join fetch " + "f.clientesDoFreelancer left join fetch f.valoresDosServicos where o.id = :id")

Repare que na hora de buscar o orcamento eu faço o join fetch na unha. Ou seja, na classe ele está marcado como LAZY mas quando eu utilizo a NamedQuery eu faço com que ele vire EAGUER.

Ai no seu caso, supondo que você quer apenas o Orcamento sem nenhum dos seus relacionamento basta tirar os “fetchs”.

Aí para executar a namedQuery você faz

R

Putzz, acho que vou conseguir resolver meu problema com isto ae
Mano, muito obrigado

Criado 17 de novembro de 2011
Ultima resposta 17 de nov. de 2011
Respostas 12
Participantes 2