Hibernate - Obtendo apenas alguns campos

1 resposta
leandrorw

Estou com um problema, preciso configurar uma Criteria genérica para retornar apenas alguns campos de uma determinada tabela com base em um exemplo, já procurei bastante no google e encontrei muito sobre Projections então fiz vários testes, consegui setar para a Criteria quais campos queria de uma tabela porém quando adiciono um Example na Criteria tenho o seguinte erro:

O hibernate define um Alias para o campo e utiliza esse Alias para construir a cláusula WHERE

Este é o método, para ver o funcionamento do Projection comentem a linha “criteria.add(example);”

public List<MODELO> procurarPorExemplo(MODELO modelo, MatchMode matchMode, int nrMaxResultados) throws SQLException {
		Session hibernateSession = (Session) em.getDelegate();
		Criteria criteria = hibernateSession.createCriteria(modelo.getClass());
		List<MODELO> modelos = null;
		
		Example example = Example.create(modelo);
		example.ignoreCase(); 
		if (matchMode != null)
			example.enableLike(matchMode);
		criteria.add(example);
		
		ProjectionList projectionList = Projections.projectionList();		
		projectionList.add(Projections.property("this.descricao").as("descricao"));
		criteria.setProjection(projectionList);
		criteria.setResultTransformer(new AliasToBeanResultTransformer(modelo.getClass()));
		
		if (nrMaxResultados > 0)
	    	criteria.setMaxResults(nrMaxResultados);				
		
		try {
			modelos = criteria.list();
		} catch(Exception erro) {
			log.error("Erro ao consultar objetos <"+modelo.getClass().getName()+">.", erro);			
			throw new SQLException(erro.getMessage());
		}
		
		return modelos;
	}

SQL gerado pelo hibernate

SQL gerado com a linha “criteria.add(example);” comentada (Projection funcionando)

Bean de mapeamento do banco de dados

package br.com.teste.bean;

// Generated 10/06/2010 14:23:35 by Hibernate Tools 3.3.0.GA

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;


/**
 * Safra generated by hbm2java
 */
@Entity
@Table(name = "SAFRA")
public class Safra implements java.io.Serializable {

	private static final long serialVersionUID = 1L;
	private Integer codSafra;
	private String descricao;

	public Safra() {
	}

	public Safra(Integer codsafra, String descricao) {
		this.codSafra = codsafra;
		this.descricao = descricao;
	}

	@Id
	@SequenceGenerator(name="GEN_SAFRA", sequenceName="GEN_SAFRA", allocationSize=1)
	@GeneratedValue(strategy=GenerationType.AUTO, generator="GEN_SAFRA")
	@Column(name = "CODSAFRA", unique = true, nullable = false)
	public Integer getCodSafra() {
		return this.codSafra;
	}

	public void setCodSafra(Integer codsafra) {
		this.codSafra = codsafra;
	}

	@Column(name = "DESCRICAO", nullable = false, length = 60)
	public String getDescricao() {
		return this.descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

}

Se alguém já passou por esse problema eu tiver outra solução ficarei muito grato.

1 Resposta

leandrorw

Consegui resolver meu problema, tive que utilizar Projections com Restrictions, tive algumas restrições com o Example, ai optei por utilizar Restrictions para criar os filtros necessários para a pesquisa e Restrictions trabalha muito bem com Projections.

Criado 11 de junho de 2010
Ultima resposta 23 de jun. de 2010
Respostas 1
Participantes 1