#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. Эй, я меняю ответ на требование, меня беспокоит только разбивка на страницы.