Populando apenas o necessário com Hibernate

Uma das funcionalidades do Hibernate é transformar os dados do banco em objeto (s) de acordo com as informações solicitadas, lhe poupando do trabalho de popula-los. Por padrão, o Hibernate popula todas os atributos do seu objeto, o que nem sempre é o desejado. Pense em um cenário no qual desejamos retornar ao frontend apenas os dados referente a identificação daquele objeto, como id e descrição, para popular um combo por exemplo. Não desejamos que o Hibernate retorne todos os atributos da classe gerando, assim, um trafego desnecessario em nossa rede.

Exemplificando, vamos imaginar que eu tenha uma classe de Produto que tenha dezenas de atributos. Não quero que o Hibernate popule todos eles, apenas o id e o nome do produto para enviar ao frontend. Para isso vamos utilizar 2 recursos: O setProjection, com a funcionalidade de projetar o que será requisitado na clausula select que, por padrão, sempre retorna os dados projetados como um array de objetos ao invés do próprio objeto (Produto); e o segundo recurso, setResultTransformer, que diz ao Hibernate como tratar os dados solicitados.

1
2
3
4
5
6
7
8
Collection collection = HibernateSessionFactory.getSession()
.createCriteria(Produto.class, "p")
.setProjection( Projections.projectionList()
    .add( Projections.property("p.id").as("id") )
    .add( Projections.property("p.nome").as("nome") )
)
.setResultTransformer(new AliasToBeanResultTransformer(Produto.class))
.list();

No exemplo acima, ao utilizarmos o método as(“atributo”), criamos uma espécie de “alias” para o Hibernate saber em que propriedade ele irá “jogar” esse dado. Tal recurso é muito interessante quando desejamos selecionar dados de uma Classe e atribui-los diretamente a um DTO ou uma classe de relatório. O AliasToBeanResultTransformer pega todos os “alias” criados apartir do .as e atribui na classe que está sendo passada procurando pelo nome do atributo na mesma.

[update data="10/08/2007 14:15"]
Adicionado alias na query
[/update