Alguém poderia me falar como fazer um criteria desse query.
OU me indicar um material muito bom sobre join e subquery com criteria
List<Solicitacao> lista = session.createQuery("select s " +
" from Solicitacao as s " +
" inner join FETCH s.tramitacao as t " +
" inner join FETCH t.tipoestado as te " +
" where t.codigo = (select max(codigo) from Tramitacao as t2 where t2.solicitacao = s.codigo) and te.estadofinal=false and data_final > current_date").list();
Na documentação explica certinho, baixe aqui: http://www.hibernate.org/docs
Na criteria você pode chamar o método createAlias para se referenciar a uma propriedade a partir da classe da classe da criteria.
List<Solicitacao> lista = criteria.createCriteria(Solicitacao.class).createAlias("tramitacao","tramitacao").createAlias("tramitacao.tipoestado",tipoEstado").
Tentei fazer a parte da navegação.
Daí após o ponto você pode continuar o código.Acredito que terá que usar uma projection para trazer o max.