Bom dia! espero que todos tenham curtido bastante o feriadão…
Estou com as seguintes dúvidas!
1º como eu faço pra informar ao hibernate que eu só quero determinados atriutos numa consulta? ex.: eu tenho uma tabela que possui os campos id, nome, sobrenome, idade, etc… Mas eu só quero os atributos id e nome…
2º vamos supor que eu tenho o seguinte mapeamento Unidade tem um atributo Funcionario e Funcionario tem um atributo Cargo… Só que eu não quero que o atributo Cargo seja instanciado quando instacio a Unidade… como eu poderia fazer isso? o mapeamento é “one-to-many”
1º Creio que não é possível, pois o Hibernate te retornará um objeto, não um objeto com determinados atributos. Ou seja, com ele você está trabalhando com objetos e não tables. (Mas pode ser que eu esteja enganado e haja uma forma).
[quote=Rafael Nunes]1º Creio que não é possível, pois o Hibernate te retornará um objeto, não um objeto com determinados atributos. Ou seja, com ele você está trabalhando com objetos e não tables. (Mas pode ser que eu esteja enganado e haja uma forma).
2º Não faço idéia.[/quote]
Quanto primeira tu pode suar uam consulta comum de sql “select id from tabela” só para isso, não sei se é a melhor solução, mas quando trabalhei com hibernate era o que usavamos talvez pela falta de experiencia.
qunato a 2ª tu pode usar uma propriedade no mapeamento do xml lazy=“false” que serve para trazer ou não os relacionamentos deste objeto mapeado, não me lembroi se é true ou false, acredito que false ele não tras.
Para saber melhor olhe a documentação ou o quickreference do hibernate lá explica certinho a propriedade, blz?
Se precisa de apenas alguns atributos, há duas opções:
Faça como o skill_ufmt sugeriu. Mas saiba que desta maneira o Hibernate não retornará uma coleção de objetos, mas sim uma coleção de arrays contendo os valores das propriedades da cláusula select. Por exemplo:
a. “from Pessoa”: retorna uma List de objetos Pessoa, portanto é possível fazer
( ( Pessoa ) pessoas.get( 0 ) ).getNome()
b. “select id, nome, sobrenome from Pessoa”: retorna uma List de arrays, então para pegar o nome seria algo como
( ( Object[] ) pessoas.get( 0 ) )[ 1 ]
Se o seu problema de performance é causado apenas uma coluna específica (por exemplo um campo Foto, binário), pode criar uma classe específica para ela, junto com a declaração do relacionamento one-to-one entre as duas classes. Por exemplo: tenho a tabela Pessoa, que entre outras colunas, possui uma chamada Documento, que contém uma foto do RG. É uma coluna pesada para ser carregada em todo select que fizer envolvendo a classe Pessoa. Então crio uma outra classe chamada Documento, que é mapeada para a coluna ‘DOCUMENTO’ na tabela ‘tPessoas’. Após isso basta declarar o relacionamento entre Pessoa e Documento.