Escriba la cláusula HQL con la API de criterios de Hibernate

Quiero escribir un método que devuelva una lista de los últimos objetos agregados agrupados por el campo 'serviceId'.

El siguiente HQL funciona, pero quiero escribir esto usando Criteria API:

FROM Notification WHERE date IN 
    (SELECT MAX(date) FROM Notification GROUP BY serviceId) 
ORDER BY date ASC

Algo como esto

Criteria crit = session.createCriteria(Notification.class);
crit.add(Restrictions.in("date", <MAX dates>));
criteria.addOrder(Order.desc("date"));

Gracias por adelantado

EDITAR

Ahora necesito una consulta similar que funcione con eclipselink API = /
ásicamente, necesito las últimas N filas (fecha máxima), cuyo estado es uno de los cinco descritos a continuación, agrupados por la columna serviceId.
Debido a mi inexperiencia, fue lo mejor que pude:

ExpressionBuilder builder = new ExpressionBuilder();
Expression exStatus1 = builder.get("status").equal(MessageType.START.toString());
Expression exStatus2 = builder.get("status").equal(MessageType.RUNNING.toString());
Expression exStatus3 = builder.get("status").equal(MessageType.PAUSED.toString());
Expression exStatus4 = builder.get("status").equal(MessageType.END_ERROR.toString());
Expression exStatus5 = builder.get("status").equal(MessageType.END_SUCCESS.toString());

ReadAllQuery query = new ReadAllQuery();
query.setReferenceClass(Notification.class);
query.setSelectionCriteria(((exStatus1).or(exStatus2).or(exStatus3).or(exStatus4).or(exStatus5)));
query.setMaxRows(listSize);
query.addDescendingOrdering("date");

Falta la cláusula para evitar duplicados de ServiceIds en las filas de resultados ...

Respuestas a la pregunta(2)

Su respuesta a la pregunta