Лучший способ реализовать подзапрос с выбором нескольких столбцов в Hibernate? - PullRequest
0 голосов
/ 28 мая 2018

Я хочу реализовать подзапрос с несколькими столбцами для группировки с помощью API Criteria.Я также знаю, что это невозможно с Criteria API, а также я не могу использовать собственный запрос.

Существует пример схемы базы данных:

CREATE TABLE IF NOT EXISTS conversation (
    id BIGSERIAL PRIMARY KEY
);

CREATE TABLE IF NOT EXISTS participant (
    id              BIGSERIAL PRIMARY KEY,
    conversation_id BIGINT REFERENCES conversation (id)
);

CREATE TABLE IF NOT EXISTS message (
    id              BIGSERIAL PRIMARY KEY,
    created_at      TIMESTAMP,
    conversation_id BIGINT REFERENCES conversation (id),
    sender_id       BIGINT REFERENCES participant (id),
    receiver_id     BIGINT REFERENCES participant (id)
);

INSERT INTO conversation (id) VALUES (1), (2), (3);
INSERT INTO participant (conversation_id) VALUES (1), (1), (1), (2), (2), (3), (3), (3), (3);
INSERT INTO message (conversation_id, sender_id, receiver_id) VALUES (1, 1, 2), (1, 1, 3), (1, 2, 1), (1, 2, 3), (2, 4, 5), (2, 5, 4), (2, 5, 4), (3, 9, 6), (3, 9, 7), (3, 9, 8);

Я хочу получать последние сообщения от каждого разговора.Запрос выглядит так:

SELECT m.*
FROM message m
WHERE (m.conversation_id, m.created_at)
  IN (SELECT
        m.conversation_id,
        max(m.created_at)
      FROM message m
      GROUP BY m.conversation_id);

Первый найденный способ - объединить два столбца.Это не очень надежно:

SELECT m.*
FROM message m
WHERE concat(m.conversation_id, m.created_at)
  IN (SELECT concat(m.conversation_id,
                    max(m.created_at))
      FROM message m
      GROUP BY m.conversation_id);

Второй способ - использовать агрегатные функции , чтобы найти идентификатор максимального значения для каждой группы.Это снижает производительность и возникают проблемы с упорядочением внутри агрегатной функции для API Criteria.

Есть ли способ заменить подзапрос чем-то надежным и быстрым без использования собственного запроса / HQL / JPQL?

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