JPA Criteria Query, чтобы найти MAX ID для каждого уникального имени - PullRequest
0 голосов
/ 19 ноября 2018

РЕДАКТИРОВАТЬ: Очевидно, мой предыдущий вопрос не был достаточным, поэтому я попытаюсь прояснить это с этой попыткой.

У меня есть набор строк в таблице, выбранных предикатом 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

Может кто-нибудь помочь мне завершить этот запрос?

1 Ответ

0 голосов
/ 19 ноября 2018

вы можете сделать это

SELECT * from [tableName] t1
WHERE not exists(SELECT * from [tableName]t2 where t1.name = t2.name and t2.id > t1.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...