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.