JPA/Hibernate erro uso criteria com Restrictions com Enum

2 respostas
P

duvida de como setar um atributo que seu conteudo é um Enum

pois qdo uso o comando abaixo me dá erro ja converti pra toString()

e continua dando erro …

c.add( Restrictions.eq(“doc.type”, Type.CPF) );

erro:
 org.hibernate.QueryException: could not resolve property: CPF of: br.com.certisign.ims.data.model.user.ImsUserImpl

public enum Type {
	CPF(0),
	CNPJ(1),
	RG(2),
	PASSPORT(3),
	TITULO(4),
	RUT(5), /* Chile */
	NIS(6), /* PIS/PASEP */
	CEI(7),
	CEIPJ(8),
	CITY_STATE_SUBSCRIPTION(9), /* Inscrição estadual/municipal */
	OTHER(10); 
	
	private final int number;

	private DocumentType(int number){
		this.number = number;
	}

	public int number(){
		return number;
	}

	public static DocumentType valueOf(int id) {
        switch (id) {
            case 0: return CPF;
            case 1: return CNPJ;
            case 2: return RG;
            case 3: return PASSPORT;
            case 4: return TITULO;
            case 5: return RUT;
            case 6: return NIS;
            case 7: return CEI;
            case 8: return CEIPJ;
            case 9: return CITY_STATE_SUBSCRIPTION;
            default: return OTHER;            
        }
    }	
}

2 Respostas

aronrodrigues

Cara, você tem que usar um "conversor" Handler

package br.com.aedas.athenas.core.dao.hibernate.enumHandle;

import java.io.Serializable;

import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;


public abstract class AbstractEnumHandler<C extends Enum<C>> implements UserType {

	protected int dbType = 0;						// Db type 
    protected Class<C> cClass = null;				// Enum class.
    
    public AbstractEnumHandler(Class<C> cClass, int dbType) {
    	
    	this.cClass = cClass;
    	this.dbType = dbType;
    	
    }
    
    public int[] sqlTypes() { 

    	return new int[] { this.dbType };
    	
    }

    
    /**
     * @see UserType#returnedClass()
     */
    public Class<C> returnedClass() {
    
    	return this.cClass;
    	
    } 
      
    
    /**
     * @see UserType#deepCopy(Object)
     */
    public Object deepCopy(Object value) throws HibernateException{ 
    	
        return value;
        
    } 
 
    
    /**
     * @see UserType#isMutable()
     */
    public boolean isMutable() { 
    
    	return false;
    	
    } 
    
 
    /**
     * @see UserType#assemble(Serializable, Object)
     */
    public Object assemble(Serializable cached, Object owner) throws HibernateException {
    
    	return cached;
    
    }
    

    /**
     * @see UserType#disassemble(Object)
     */
    public Serializable disassemble(Object value) throws HibernateException { 
    
    	return (Serializable)value; 
    
    } 
 
    
    /**
     * @see UserType#replace(Object, Object, Object)
     */
    public Object replace(Object original, Object target, Object owner) throws HibernateException { 
    
    	return original; 
    
    }
    
    
    /**
     * @see UserType#hashCode()
     */
    public int hashCode(Object x) throws HibernateException { 
    
    	return x.hashCode(); 
    
    }
    
    
    /**
     * @see UserType#equals(Object)
     */
    public boolean equals(Object x, Object y) throws HibernateException { 
    	
    	return (x == y) && (null != x || null != y) && x.equals(y); 
        
    }
    
}
package br.com.aedas.athenas.core.dao.hibernate.enumHandle;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;

public abstract class AbstractEnumToString<C extends Enum<C>> extends AbstractEnumHandler<C> {


	/**
	 * Creates an enum handler to persist enum as String.
	 * @param cClass Enum class.
	 */
    protected AbstractEnumToString(Class<C> cClass) { 

    	super(cClass, Types.VARCHAR); 

    } 

    
    /**
     * @see UserType#nullSafeSet(java.sql.PreparedStatement, Object, int)
     */
    public Object nullSafeGet(ResultSet rs, String[] names, Object arg2) throws HibernateException, SQLException {

    	String name = rs.getString(names[0]); 
        C result = null; 
        if (!rs.wasNull()) { 
       	 
            result = Enum.valueOf(cClass, name);
            
        } 
        
        return result; 
   
    }
  
    
    /**
     * @see UserType#nullSafeSet(PreparedStatement, Object, int)
     */
    @SuppressWarnings("unchecked")
    public void nullSafeSet(PreparedStatement ps, Object value, int index) throws HibernateException, SQLException {
    	
    	if (null == value) {
    		
            ps.setNull(index, this.dbType);
            
        } else {
        	
        	ps.setString(index, ((Enum)value).name());
            
        }
    	
    }

    
}

Espero que vc entenda

aronrodrigues

Segue o link da documentação

http://www.hibernate.org/272.html

Criado 23 de janeiro de 2009
Ultima resposta 3 de fev. de 2009
Respostas 2
Participantes 2