Я хочу написать метод, который возвращает список последних добавленных объектов, сгруппированных по полю 'serviceId'.Записать предложение HQL с использованием Hibernate Criteria API
Следующая HQL работает, но я хочу, чтобы написать это с помощью Criteria API:
FROM Notification WHERE date IN
(SELECT MAX(date) FROM Notification GROUP BY serviceId)
ORDER BY date ASC
Что-то вроде этого:
Criteria crit = session.createCriteria(Notification.class);
crit.add(Restrictions.in("date", <MAX dates>));
criteria.addOrder(Order.desc("date"));
Спасибо заранее.
EDIT:
Теперь мне нужен подобный запрос, который работает с помощью EclipseLink API =/
В принципе, мне нужно последний N строк (дата макс), статус которых один из пяти описанной сильфон, сгруппированы по столбцу serviceId.
Из-за моей неопытности, это было лучшее, что я мог бы:
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");
Предложение, чтобы избежать дубликатов serviceIds в строки результата не хватает ...
Но OP хочет, чтобы подзапрос был 'select max (date) из группы уведомлений serviceId', вместо этого просто' select max (date) from Notification' –
Моя ошибка, обновлена. –
Прекрасно работает! Благодарю. – elias