Converter SQL em criteria

Olá pessoal!

Estou com uma sql e gostaria de utilizar ela com criteria, mas como sou novo no java não estou conseguindo…

Tenho a tabela Proposta, onde mantenho um registro de revisões e na listagem tenho que exibir apenas a revisão mais alta.

SELECT * 
  FROM Proposta AS t
 INNER JOIN 
       ( 
       SELECT MAX(id) AS id, MAX(revisao) AS revisao
           FROM Proposta
          GROUP BY numero 
          ) ds
 ON
 t.id = ds.id
WHERE t.funcionario_id = IFNULL(NULL, t.funcionario_id);

Ops, faltou as classes…
Estou omitindo includes, getters e setter para ficar menor…

@Entity
@Table(name = "Proposta")
public class PropostaVO {

	@Id
	@GeneratedValue
	private int id;
	private int numero;
	private Date data;
	private int revisao;
	private int ciclo;
	private String referencia;
	private String origem;
	private String condicaoPagamento;
	private String condicaoEntrega;
	private String reajustePreco;
	private String imposto;
	private String validade;
	private String garantia;
	@Temporal(TemporalType.TIMESTAMP)
	@Column(updatable = false)
	private Date dataCadastro;
	@ManyToOne(fetch = FetchType.EAGER)
	private FuncionarioVO funcionario;
	@ManyToOne(fetch = FetchType.EAGER)
	private ClienteVO cliente;
	@ManyToOne(fetch = FetchType.EAGER)
	private EmissorVO emissor;
	@ManyToOne(fetch = FetchType.EAGER)
	private ContatoVO contato;

	//Getters and Setters

}
@Entity
@Table(name = "Funcionario")
public class FuncionarioVO {

	@Id
	@GeneratedValue
	private int id;
	private String nome;
	private String email;
	private String telefone;
	private String celular;
	private String cargo;
	private boolean ativo;
	private boolean listarTodos;
	@Temporal(TemporalType.TIMESTAMP)
	@Column(updatable = false)
	private Date dataCadastro;

	//Getters and Setters

}
@Entity
@Table(name = "Cliente")
public class ClienteVO {

	@Id
	@GeneratedValue
	private int id;
	private String nomeFantasia;
	private String razaoSocial;
	private String cnpj;
	private String ie;
	private String email;
	private String telefone;
	private String celular;
	private String fax;
	private String cep;
	private String logradouro;
	private String complemento;
	private String numero;
	private String cidade;
	private String bairro;
	private String uf;
	@Temporal(TemporalType.TIMESTAMP)
	@Column(updatable = false)
	private Date dataCadastro;
	@ManyToOne(fetch = FetchType.EAGER)
	private SegmentoVO segmento;

	//Getters and Setters

}
@Entity
@Table(name = "Emissor")
public class EmissorVO {

	@Id
	@GeneratedValue
	private int id;
	private String nomeFantasia;
	private String razaoSocial;
	private String siglaProposta;
	private String cnpj;
	private String ie;
	private String email;
	private String telefone;
	private String celular;
	private String fax;
	private String cep;
	private String logradouro;
	private String complemento;
	private String numero;
	private String cidade;
	private String bairro;
	private String uf;
	@Temporal(TemporalType.TIMESTAMP)
	@Column(updatable = false)
	private Date dataCadastro;

	//Getters and Setters

}
@Entity
@Table(name = "Contato")
public class ContatoVO {

	@Id
	@GeneratedValue
	private int id;
	private String nome;
	private String email;
	private String telefone;
	private String celular;
	private String departamento;
	private String cargo;
	@Temporal(TemporalType.TIMESTAMP)
	@Column(updatable = false)
	private Date dataCadastro;
	@ManyToOne(fetch = FetchType.EAGER)
	private ClienteVO cliente;
	@ManyToOne(fetch = FetchType.EAGER)
	private PeriodicidadeVO periodicidade;

	//Getters and Setters

}

Obrigado!

Postar apenas a query não ajuda, afinal, a(s) classe(s) envolvida(s) (podem ser mais de uma ou apenas uma) pode(m) ter n implementações.
Coloque o que está envolvido e poderemos ajudar.