Последняя запись в каждой группе - PullRequest
0 голосов
/ 04 августа 2020

Я использую oracle 11.2, я пытаюсь получить последнюю запись в каждой группе.

В моей таблице ce у меня есть поле id, date, name.

select ce1.*
from ce ce1
inner join 
  (select account_id, max(date) as max_date from ce group by account_id ) as group_id
   on ce1.account_id=group_id.account_id
  and ce1.date=group_id.max_date
where ce1.account_id in (....)

которые работают ну

Я безуспешно пытаюсь преобразовать его в jpql, моя реализация jpa - спящий режим

select ce1
    from ce ce1
    inner join 
      (select accountId as accountId, max(date) maxDate from ce group by accountId ) as group_id
       on ce1.accountId=group_id.accountId
      and ce1.date=group_id.maxDate
    where ce1.accountId in (....)

Jpa, похоже, не любит внутреннее соединение и максимальный

неожиданный токен (неожиданный токен макс.

1 Ответ

1 голос
/ 04 августа 2020

Предполагая сущность Ce:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Ce> cq = cb.createQuery(Ce.class);

Root<Ce> rootCe = cq.from(Ce.class);

Subquery<Date> sqMaxDate = cq.subquery(Date.class);
Root<Ce> sqRootCe = sqMaxDate.from(Ce.class);
sqMaxDate.where(cb.equal(rootCe.get(Ce_.accountId),sqRootCe.get(Ce_.accountId)));
sqMaxDate.select(cb.max(sqRootCe.get(Ce_.date)));

cq.where(cb.and(cb.equal(rootCe.get(Ce_.date),sqMaxDate.getSelection()),
                 rootCe.get(Ce_.accountId).in([...])));

Результат этого запроса:

Select * from CE ce1
Where ce1.account_id in ([...])
    and ce1.date = (
        select max(date) from CE ce2
        where ce1.account_id = ce2.account_id
    );

Без сущности я считаю, что это решение действительно. Получаем максимальную дату для каждого идентификатора учетной записи и устанавливаем ее как условие основного запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...