Consulta retorna todos os atributos no hibernate

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”

Obrigado…

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=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:

  1. 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 ]
  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.