Разбивка на страницы JDBC в отношении «один ко многим» и сопоставление с pojo?

#java #oracle11g #pagination #one-to-many #spring-jdbc

#java #oracle11g #разбивка на страницы #один ко многим #spring-jdbc

Вопрос:

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

  ----------- ---------- --------- --------------------- 
| messageId | auditor  |  status |      timestamp      |
 ----------- ---------- --------- --------------------- 
|        10 | program1 | Failed  | 2020-08-01 10:00:00 |
|        11 | program2 | success | 2020-08-01 10:01:10 |
|        12 | program3 | Failed  | 2020-08-01 10:01:15 |
 ----------- ---------- --------- --------------------- 
  

Поскольку в заданном диапазоне дат у нас может быть много сообщений, соответствующих критериям, поэтому мы добавили разбивку на страницы для запроса. Теперь в качестве новой функции мы добавляем еще одну таблицу с отношением «один ко многим», которая содержит теги в качестве возможных причин сбоя. Таблица failure_tags будет выглядеть следующим образом

  ----------- ---------- ------- -------- 
| messageId | auditor  |  type | cause  |
 ----------- ---------- ------- -------- 
|        10 | program1 | type1 | cause1 |
|        10 | program1 | type1 | cause2 |
|        10 | program1 | type2 | cause3 |
 ----------- ---------- ------- -------- 
  

Теперь для общего поискового запроса для status = ‘Failed’ и с помощью left join с другой таблицей будут получены 4 строки, как показано ниже

  ----------- ---------- ------- -------- --------------------- 
| messageId | auditor  |  type | cause  |      timestamp      |
 ----------- ---------- ------- -------- --------------------- 
|        10 | program1 | type1 | cause1 | 2020-08-01 10:00:00 |
|        10 | program1 | type1 | cause2 | 2020-08-01 10:00:00 |
|        10 | program1 | type2 | cause3 | 2020-08-01 10:00:00 |
|        12 | program3 |       |        | 2020-08-01 10:01:15 |
 ----------- ---------- ------- -------- --------------------- 
  

Требование состоит в том, чтобы, поскольку 3 строки MessageId 10 принадлежат одному и тому же сообщению, требование состоит в том, чтобы объединить строки в 1 в ответе json, поэтому в ответе будет только 2 элемента

 [
  {
    "messageId": "10",
    "auditor": "program1",
    "failures": [
      {
        "type": "type1",
        "cause": [
          "cause1",
          "cause2"
        ]
      },
      {
        "type": "type2",
        "cause": [
          "cause3"
        ]
      }
    ],
    "date": "2020-08-01 10:00:00"
  },
  {
    "messageId": "12",
    "auditor": "program3",
    "failures": [],
    "date": "2020-08-01 10:01:15"
  }
]
  

Из-за этого слияния для запроса разбивки на страницы из 10 элементов после извлечения из базы данных и слияния приведет к получению менее 10 результатов.

Решение 1, о котором я мог подумать, заключается в том, что после слияния, если оно меньше размера страницы, снова запустите поиск, выполните процесс объединения и возьмите 10 лучших элементов. Есть ли лучшее решение для получения всех результатов в 1 запросе вместо того, чтобы дважды или более обращаться к БД?

Мы используем общий spring — JDBC, а не JPA.

Комментарии:

1. Вам нужно манипулировать ответом на ваш код после извлечения из базы данных

2. Эй, я меняю ответ на требование, меня беспокоит только разбивка на страницы.