🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

1558閲覧

Controllerから受け取ったListを、同じ日付のデータでグループ化して表示したい

takatomo312

総合スコア1

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

1グッド

0クリップ

投稿2021/03/05 13:49

編集2021/03/05 13:55

前提・実現したいこと

SpringBootでWEBアプリ、HTML、CSSの勉強をしています。
teratrailから質問をするのは初めてで不慣れなため、ご指摘いただけたら修正・追記します。

下の表のようなListをhtmlがControllerから受け取って、同じ日付のデータでグループ化して、
イメージAのような形で表示したいです。

コードでご回答をいただけるのが理想ですが、考え方のヒントなどをご回答いただけるだけでも幸いです。

↓List

datename
2021-01-01AAA
2021-01-01BBB
2021-01-01CCC
2021-01-02DDD
2021-01-02EEE
2021-01-03FFF
2021-01-03GGG
2021-01-03HHH

↓イメージA
イメージ説明

発生している問題

どのようにhtmlを記述してよいか、恥ずかしながら見当がつきません。

試したこと

th:eachでループさせて、イメージBのような単純な表形式で表示することはできました。
しかしながら、同じ日付が並ぶと冗長な印象のため、イメージAのような形にしたいです。

html

1<div class="box" th:each="item : ${items}"> 2 <div class="box-left">[[${item.date}]]</div> 3 <div class="box-right">[[${item.name}]]</div> 4</div>

css

1.box { 2 display:flex; 3} 4.box-left { 5 border:solid 1px #000000; 6} 7.box-right { 8 border:solid 1px #000000; 9}

↓イメージB(Excelで作成した画像のため装飾はCSSとは一致していません)
イメージ説明

環境

開発環境:Eclipse 2020-12
フレームワーク:Spring Boot 2.4.0
データベース:MySQL 5.7.33
Java:11
テンプレートエンジン:Thymeleaf

gpsoft👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Thymeleaf側でグループ化するのはキツイので、その手前でグループ化した方が良いと思います。例えば、コントローラの中でグループ化してからThymeleafへ渡すとか。あるいは、DBから取り出す時点でグループ化してしまう、といった方法があります。

コントローラの中でグループ化する場合、
仮にモデルクラスがItemで、dateフィールドがLocalDate型だとすると、

java

1List<Item> items = ... // DBからItemを検索(date, nameでソート) 2Map<LocalDate, List<Item>> groups = items.stream() 3 .collect(Collectors.groupingBy( 4 Item::getDate, 5 LinkedHashMap::new, 6 Collectors.toList()));

こんな感じでグループ化できると思います。んで、このgroupsをThymeleafへ渡します。

Thymeleaf側は、

html

1<div th:each="group: ${groups}"> 2 3 <div th:text="${group.key}"></div> 4 5 <div th:each="item: ${group.value}"> 6 <div th:text="${item.name}"></div> 7 </div> 8 9</div>

こんな感じです。

group.keyLocalDateオブジェクトで、group.valueList<Item>オブジェクトです。

投稿2021/03/06 07:56

gpsoft

総合スコア1323

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takatomo312

2021/03/06 11:25

実現したい機能を実装することができました! あらかじめMapでグループ化してからhtmlに渡すという発想に目からうろこです。 どうもありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問