Início > programação, programação JSF > Como retornar e preencher apenas alguns atributos da entidade na consulta com Hibernate

Como retornar e preencher apenas alguns atributos da entidade na consulta com Hibernate

Esses dias desenvolvi um sistema que teria que armazenar uma entidade em escopo de sessão, porém a classe representada pela entidade tinha vários atributos de instância. Isso despertou uma certa preocupação em relação ao consumo de memória, visto que haveriam muitos acessos simultâneos ao sistema e quase todos os usuários teriam esse objeto setado na sessão. O detalhe é que em termos de escopo de sessão eu precisava de apenas alguns atributos, enquanto vários outros eu precisava em apenas algumas telas – poderia ser escopo de requisição.

A solução foi puxar somente alguns dos atributos na consulta que retornava o objeto a ser colocado na sessão. Quando eu precisasse dos outros atributos da entidade, teria uma variável do mesmo tipo em um managed bean com escopo de request que seria utilizado nas telas.

Pensei então: para fazer isso com JDBC é muito fácil, mas minha aplicação usa Hibernate. É possível fazer isso com Hibernate? Como?

Após algumas horas de pesquisa descobri a classe AliasToBeanResultTransformer que simplifica bastante as coisas para a gente. Vamos aos códigos:

Minha entidade:


package br.uece.anais.model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "parametros_sistema_anais")
public class ParametrosSistemaAnais implements Serializable {

	private static final long serialVersionUID = 9000534095819154234L;

	@Id
	@Column(name = "id_parametro", nullable=false)
	@SequenceGenerator(name = "sequence_parametros_sistema_anais", sequenceName = "sequence_parametros_sistema_anais")
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence_parametros_sistema_anais")
	private Integer idParametro;

	@Column(name = "id_semana", nullable=false)
	private int idSemana;
	@Column(name = "texto_inicial", nullable=false)
	private String textoInicial;
	@Column(name = "objetivos", nullable=false)
	private String objetivos;
	@Column(name = "programacao", nullable=false)
	private String programacao;
	@Column(name = "premiacao", nullable=false)
	private String premiacao;
	@Column(name = "titulo_semana", nullable=false)
	private String tituloSemana;
	@Column(name = "ano_semana", nullable=false)
	private int anoSemana;

        // gets, sets, equals e hashCode
}

Meu Managed Bean com escopo de sessão:


package br.uece.anais.view;

import br.uece.anais.model.ParametrosSistemaAnais;
import br.uece.anais.model.Usuario;

public class SessaoBean {
   private ParametrosSistemaAnais parametroSelecionado;
   private Usuario usuarioLogado;

   // gets e sets
}

O método do DAO:

public ParametrosSistemaAnais findByParametro(Integer idParametro) {
   ParametrosSistemaAnais parametro = new ParametrosSistemaAnais();
      try {
         getHibernate().beginTransaction();
         Query query = null;
	 query = getHibernate().getSession().createQuery("select idParametro as idParametro, idSemana as idSemana, tituloSemana as tituloSemana, anoSemana as anoSemana from ParametrosSistemaAnais where idParametro=?");
	 query.setParameter(0, idParametro);
	 query.setResultTransformer(new AliasToBeanResultTransformer(ParametrosSistemaAnais.class));
	 parametro = (ParametrosSistemaAnais) query.uniqueResult();
	 getHibernate().commit();
      } finally {
	 getHibernate().close();
      }
      return parametro;
}

Observe que criamos um objeto do tipo org.hibernate.Query. Esse objeto é gerado a partir do método createQuery, da classe org.hibernate.Session. Esse método recebe uma string que é a consulta a ser realizada. Como podemos perceber os aliases das colunas retornadas pela consulta batem com os atributos que desejo preencher da classe ParametrosSistemaAnais. Isso é feito para que possa ocorrer o mapeamento entre as colunas retornadas e os atributos da entidade.

Percebe-se, portanto, que estamos trazendo e preenchendo apenas 4 dos atributos da classe ParametrosSistemaAnais. Quando armazenarmos esse objeto no managed bean de sessão estaremos economizando a memória que os outros 4 atributos que ficaram com null consumiriam. E no meu caso esses objetos são String’s com um tamanho bastante razoável, pois armazenam código HTML. A economia de memória é bastante razoável, certamente.

Anúncios
  1. juniorsatanas
    17/06/2010 às 02:20

    que tau postar onde ta todo o crud : ? blog nota 100 valeu

  2. Diogo Souza
    10/02/2011 às 20:23

    Muito bom teu post!! Parabéns!! 😀

  3. Jailson Silva
    23/05/2012 às 15:25

    gostaria de uma ajuda sua amigo, implementei um código baseado no seu, mas está dando o seguinte rro:

    Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.hibernate.Query
    at br.com.nazarenoneto.conciliador.dao.RegistroCvDao.findByNumeroSequencia(RegistroCvDao.java:103)
    at br.com.nazarenoneto.conciliador.bean.ListagemBean.getComprovantes(ListagemBean.java:65)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
    at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:71)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:106)

    se vc puder me dá uma dica da onde pode ser meu erro, fico bastante grato, e parabéns pelo seu post.

    Jailson Silva

  4. 23/08/2013 às 09:14

    Muito bom teu post!! Parabéns!!

  1. 12/02/2010 às 14:17
  2. 02/12/2010 às 22:52

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: