Como posso fazer utilizando Criteria?

Pessoal,

Tenho uma entidade LancamentoVenda cujos registros no banco de dados não são alterados ou excluídos para possibilitar relatórios retroativos. A alteração gera uma nova inclusão e a exclusão preenche a propriedade dataCancelamento.

public class LancamentoVenda extends MappedEntity {

	private static final long serialVersionUID = -1730542112663270459L;
	
	private Integer numeroLancamento;
	
	private Date dataEmissao;
	
	private Date dataCompetencia;
	
	private String observacao;
	
	private Double valorLiquido;
	
	private Date dataOperacao;
	
	private UsuarioSIG responsavel;
	
	private Faturamento faturamento;
	
	private List<ParcelaLancamentoVenda> listaParcela;
	
	private List<RateioLancamentoVenda> listaRateio;
	
	private List<RetencaoLancamentoVenda> listaRetencao;
	
	private List<DeducaoLancamentoVenda> listaDeducao;

	private Date dataCancelamento; 
        
        ...
}

Com isso eu teria no banco de dados no caso de um lançamento de venda Nº 622009 ter sido alterado, duas tuplas:


NUMG_LancamentoVenda, NUMR_Versao, NUMR_Lancamento, DATA_Emissao, VALR_Liquido, DATA_Ocorrencia
62, 1, 622009, 2008-12-16, 9344.47, 2009-01-09 15:54:32
63, 1, 622009, 2008-12-16, 1000.47, 2009-01-10 16:30:00

O que ocorre é que preciso buscar todos os lançamentos de venda em um determinado período. E tenho que pegar
as cópias mais recentes. No exemplo acima a segunda linha seria retornada pois a DATA_Ocorrencia (que controla a data de gravação da tupla) é maior.

Gostaria de saber se seria possível fazer isso utilizando-se criteria. Atualmente utilizamos SQL puro usando o addEntity do SQLQuery para converter as tuplas retornadas nas entidades correspondentes, como este outro exemplo:

			sql.append("if object_id('tempdb..#temp') > 0 drop table #temp ");
			sql.append("select top 1 ");
			sql.append("pa.NUMG_Parametrizacao ");
			sql.append("into #temp ");
			sql.append("from ");
			sql.append("dbo.orc_Parametrizacoes pa ");
			sql.append("where ");
			sql.append("pa.NUMG_Empresa = ? and pa.NUMG_ParametrizacaoTipo = 3 ");
			sql.append("order by ");
			sql.append("pa.DATA_Parametrizacao DESC ");
			sql.append("select ca.*,co.* ");
			sql.append("from ");
			sql.append("#temp t ");
			sql.append("inner join dbo.colParametrizacoesDespesasContasSinteticas col on t.NUMG_Parametrizacao = col.NUMG_Parametrizacao ");
			sql.append("inner join dbo.fin_ContasAnaliticas ca on ca.NUMG_ContaSintetica = col.NUMG_ContaSintetica ");
			sql.append("inner join dbo.fin_Contas co on co.NUMG_Conta = ca.NUMG_ContaAnalitica ");
			sql.append("inner join dbo.fin_ContasDescricao cd on co.NUMG_ContaDescricao = cd.NUMG_ContaDescricao ");
			sql.append("where cd.DESC_ContaDescricao like ? ");
			sql.append("order by cd.DESC_ContaDescricao ");

			return getSession().createSQLQuery(sql.toString()).addEntity(ContaAnalitica.class).setLong(0, empresa.getId()).setString(1, "%" + descricao + "%").list();

Mas gostaria de trabalhar com criteria pois gosto muito da forma como o código fica organizado e toda vez que tenho este tipo de problema, como uma subquerie, tenho que recorrer ao velho SQL.

Desde já agradeço a atenção dispensada.

http://blog.dclick.com.br/2008/10/09/hibernate-criteria-com-subquery/pt/