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.