РЕДАКТИРОВАТЬ: Очевидно, мой предыдущий вопрос не был достаточным, поэтому я попытаюсь прояснить это с этой попыткой.
У меня есть набор строк в таблице, выбранных предикатом p1 ниже каждого из которых есть уникальное значение в столбце id .Столбец pathName может иметь несколько экземпляров одного и того же значения.Требуется вернуть только те объекты, которые имеют отличное pathName с наибольшим значением id .
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<TextDocument> query = builder.createQuery(TextDocument.class);
Root<TextDocument> root = query.from(TextDocument.class);
// descending ids, and group similar names together
query.orderBy(builder.desc(root.get(TextDocument_.id)));
query.groupBy(root.get(TextDocument_.pathName));
// filter
Predicate p1 = builder.equal(root.get(TextDocument_.parent), rootdoc);
Predicate p2 = builder.equal(root.get(TextDocument_.id), builder.max(root.get(TextDocument_.id)));
query.where(p1, p2);
Предикат p1 selectдокументы, которые имеют один и тот же родительский документ, и это, конечно, работает, пока оно само по себе.
Предикат p2 , однако, все неверно.Добавление этого вызывает исключение ОШИБКА 42903: Неправильное использование статистической функции. .
Решение аналогичной проблемы запроса показано здесь в SQL, но я хочу сделать это с помощью JPA Criteria Query.Я не могу понять, как заставить работать вложенный синтаксис SELECT.
Чтобы повторить проблему с моим собственным примером, у меня есть следующий набор данных
id parent pathName
--- ------- ---------
101 22 alpha
130 22 beta
250 22 charlie
251 22 alpha
339 22 beta
400 22 alpha
401 22 delta
Правильный результат (для родителя= 22) будет:
id parent pathName
--- ------- ---------
250 22 charlie
339 22 beta
400 22 alpha
401 22 delta
Может кто-нибудь помочь мне завершить этот запрос?