Представить результат MySQL-запроса в виде Map

127
15 декабря 2016, 15:58

Есть таблица статей со структурой:

id       - ID
text     - Текст статьи
user_id  - ID пользователя добавивиший статью
created  - дата создания в формате Y-m-d H:i:s

Данные в таблице:

id | text    | user_id  | created
----------------------------------------------
1  | Text 1  |     1    | 2000-01-01 00:00:01
2  | Text 2  |     2    | 2000-01-01 00:00:02
3  | Text 3  |     3    | 2000-01-01 00:00:03

и таблица комментарий к статьям со структурой:

id          - ID
text        - Текст комментария
article_id  - ID статьи
user_id     - ID пользователя добавивиший комментарий
created     - дата создания в формате Y-m-d H:i:s

Данные в таблице:

id | text         | article_id   | user_id   | created
--------------------------------------------------------------
1  | Comment 1.1  |     1        |     1     | 2000-01-01 00:00:01
2  | Comment 2.1  |     2        |     2     | 2000-01-01 00:00:02
3  | Comment 3.1  |     3        |     3     | 2000-01-01 00:00:03
4  | Comment 1.2  |     1        |     1     | 2000-01-01 00:00:01
5  | Comment 2.2  |     2        |     2     | 2000-01-01 00:00:02
6  | Comment 3.3  |     3        |     3     | 2000-01-01 00:00:03
7  | Comment 1.3  |     1        |     1     | 2000-01-01 00:00:01
8  | Comment 2.3  |     2        |     2     | 2000-01-01 00:00:02
9  | Comment 3.3  |     3        |     3     | 2000-01-01 00:00:03

LEFT JOIN запросом получаю результат

a_id | a_text | comment_text | created
-------------------------------------------------------------
  1  | Text 1 | Comment 1.1  | 2000-01-01 00:00:01
  2  | Text 1 | Comment 1.2  | 2000-01-01 00:00:02
  3  | Text 1 | Comment 1.3  | 2000-01-01 00:00:03
  4  | Text 2 | Comment 2.1  | 2000-01-01 00:00:01
  5  | Text 2 | Comment 2.2  | 2000-01-01 00:00:02
  6  | Text 2 | Comment 2.3  | 2000-01-01 00:00:03
  7  | Text 3 | Comment 3.1  | 2000-01-01 00:00:01
  8  | Text 3 | Comment 3.2  | 2000-01-01 00:00:02
  9  | Text 3 | Comment 3.3  | 2000-01-01 00:00:03

Как этот результат представить в виде Map < Artice, List <Comment> > ?

Answer 1

Грубо говоря, получится что-то вроде этого:

ResultSet rs = statement.execute();
Map<Article, List<Comment>> map = new HashMap<Article, List<Comment>>();
while (rs.hasNext()) {
    Article a = new Article(rs.getString("a_text"));
    List<Comment> comments = map.get(a);
    if (comments == null) {
        comments = new LinkedList<Comment>();
        map.put(a, comment);
    }
    Comment c = new Comment(rs.getString("comment_text"));
    comments.add(c);
}

Обязательно, чтобы в классе Article был реализован метод equals, желательно, чтобы ещё был реализован метод hashCode, вычисляющий хэш объекта по тексту. Для упрощения сравнения статей лучше в выборку добавить id статьи и записывать его в объект при создании. Тогда сравнивать можно будет только по id.

READ ALSO
Прибавить + 1 в MySQL

Прибавить + 1 в MySQL

В случае, если одновременно этот запрос выполнится под 20 людьми, счётчик не залагает? Например вместо 20, запишет 21 или вообще 18?

146
Подсчет записей в запросе

Подсчет записей в запросе

Как посчитать количество записей из дополнительной таблицы?

135
Как связать 2 таблицы в MySQL?

Как связать 2 таблицы в MySQL?

Нужно связать 2 таблицы по id

194