Problema com Criteria e chave copsta(composite-key)

Pessoal, bom dia!
estou com o seguinte problema, estou tentando rodar um query via criteria que tem chave composta, segue os detalhes da minha implmentacao:

Classe ForcaTrabalhoPK que é embeddable


@Embeddable
public class ForcaTrabalhoPK implements Serializable{
	

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;


	private String matricula;
	
	
	private Empresa empresa;

	
	/**
	 * @return the matricula
	 */
	@Column(name = "FOTR_CD_MATRICULA", unique = true, nullable = false, length=15)
	public String getMatricula() {
		return matricula;
	}

	/**
	 * @param matricula the matricula to set
	 */
	public void setMatricula(String matricula) {
		this.matricula = matricula;
	}
	
	
	 /**
     * Getter empresa.
     * @return valor do empresa
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "EMPR_CD_EMPRESA", nullable = false)
    public Empresa getEmpresa() {
        return empresa;
    }
    /**
     * Setter para empresa.
     * @param value valor para empresa
     */
    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }
    

}

Classe persistente ForcaTrabalho



public class ForcaTrabalho {

	/* ---------------- Atributos ----------------- */

	/**
	 * Campo matricula (PK)
	 */
	private ForcaTrabalhoPK id; 

// restante dos atributos....

@EmbeddedId
	public ForcaTrabalhoPK getId() {
		return this.id;
	}

	/**
	 * Setter para matricula.
	 * 
	 * @param value
	 *            valor para matricula
	 */

	public void setId(ForcaTrabalhoPK id) {
		this.id = id;
	}

Meu dao, no método da query:

 DetachedCriteria criteria = daoBehavior.createDetachedCriteria(ForcaTrabalho.class);
   if(StringUtils.isNotBlank(forcaTrabalhoFilter.getChave())){
            criteria.add(Restrictions.ilike("chaveColaborador", forcaTrabalhoFilter.getChave().trim(), org.hibernate.criterion.MatchMode.ANYWHERE));
        }
        /* SITUACAO */
        if(forcaTrabalhoFilter.getSituacaoASMS() != null){
            criteria.add(Restrictions.eq("situacaoPetrobras",forcaTrabalhoFilter.getSituacaoASMS()));
        }
        /* MATRICULA */
        if(StringUtils.isNotBlank(forcaTrabalhoFilter.getMatricula())){
            criteria.add(Restrictions.ilike("id.matricula", forcaTrabalhoFilter.getMatricula().trim(),org.hibernate.criterion.MatchMode.ANYWHERE));
        }
        
        /* NOME */
       if(StringUtils.isNotBlank(forcaTrabalhoFilter.getNome())){
            criteria.add(Restrictions.ilike("nomeColaborador", forcaTrabalhoFilter.getNome().trim(), org.hibernate.criterion.MatchMode.ANYWHERE));
        }
        
        // Ordenacao default = Matricula
        if(pagination.getOrdering() != null && pagination.getOrdering().length == 0){ 
            criteria.addOrder(Order.asc("id.matricula").ignoreCase());
        }

  return daoBehavior.findByCriteria(criteria, pagination);

Erro:


SEVERE: org.springframework.orm.hibernate3.HibernateQueryException: property does not map to a single column: id; nested exception is org.hibernate.QueryException: property does not map to a single column: id
javax.faces.el.EvaluationException: org.springframework.orm.hibernate3.HibernateQueryException: property does not map to a single column: id; nested exception is org.hibernate.QueryException: property does not map to a single column: id
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at br.com.petrobras.framework.support.jsf.listener.BusinessExceptionCatcherActionListener.processAction(BusinessExceptionCatcherActionListener.java:71)
	at javax.faces.component.UICommand.broadcast(UICommand.java:387)
	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:329)
	at org.ajax4jsf.component.AjaxViewRoot.broadcastEventsForPhase(AjaxViewRoot.java:304)
....

Caused by: org.springframework.orm.hibernate3.HibernateQueryException: property does not map to a single column: id; nested exception is org.hibernate.QueryException: property does not map to a single column: id
	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:657)
	at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
	at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
	at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1055)
	at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1048)
....
Caused by: org.hibernate.QueryException: property does not map to a single column: id
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumn(CriteriaQueryTranslator.java:394)
	at org.hibernate.criterion.CountProjection.toSqlString(CountProjection.java:62)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getSelect(CriteriaQueryTranslator.java:333)
	at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:102)
	at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
	at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:91)

Alguém faz ídeia, ou já passou por isso?

Obrigado,

Marcelo :shock:

Cara, eu saco nada de criteria do Hibernate não, mas me interessei na pergunta. Faz um teste aí:
troca de id.matricula para Id.matricula

Caso não funciona (pois vi em um post alguém falar algo do tipo), olhe esse post: http://www.guj.com.br/java/117757-resolvido-hibernate-composite-id-projections

Pesquisando e perdendo os meus cabelos , vi que o porblema se dá no método da classe CriteriaQueryTranslator bem no método:getColumn(Criteria criteria, String propertyPath)

O método tem o seguinte código:

public String getColumn(Criteria criteria, String propertyName) {
		String[] cols = getColumns( propertyName, criteria );
		if ( cols.length != 1 ) {
			throw new QueryException( "property does not map to a single column: " + propertyName );
		}
		return cols[0];
	}

O problema que o array cols sempre retorna 2 colunas, e ai ele sempre entra nesta exception.

No javadoc ele diz que este método ignora os alias do projection

“Get the names of the columns mapped by a property path, ignoring projection aliases”

Ainda estou atrás da solução.

t+