質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Thymeleaf

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

Spring Boot

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

Q&A

解決済

1回答

300閲覧

Java/springで新着順(日付が新しい順)を実装したい

dwdwdw

総合スコア1

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Thymeleaf

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

Spring Boot

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

0グッド

0クリップ

投稿2024/01/17 03:25

編集2024/01/17 03:34

実現したいこと

言語はjava、FWはspring。
postingテーブルのinsert_date(TIMESTAMP型)カラムで新着順で並び替えたい。

発生している問題・分からないこと

エラーは発生しないが並び替えがされない。

該当のソースコード

java(コントローラー

1import java.text.SimpleDateFormat; 2import java.time.LocalDateTime; 3import java.time.ZoneId; 4import java.time.format.DateTimeFormatter; 5import java.time.temporal.ChronoUnit; 6import java.util.Date; 7import java.util.List; 8 9import javax.servlet.http.HttpSession; 10import javax.validation.Valid; 11 12import org.springframework.data.domain.Pageable; 13import org.springframework.data.domain.Sort; 14import org.springframework.stereotype.Controller; 15import org.springframework.ui.Model; 16import org.springframework.validation.BindingResult; 17import org.springframework.validation.ObjectError; 18import org.springframework.web.bind.annotation.ModelAttribute; 19import org.springframework.web.bind.annotation.RequestMapping; 20 21import jp.co.x.x.entity.Posting; 22import jp.co.x.x.form.PostingForm; 23import jp.co.x.x.repository.CommentRepository; 24import jp.co.x.x.repository.PostingRepository; 25import jp.co.x.x.service.PostingService; 26import lombok.RequiredArgsConstructor; 27 28@RequiredArgsConstructor 29@Controller 30class PostingController { 31 32 33// DI 34 private final PostingRepository postingRepository; 35 private final HttpSession session; 36 private final CommentRepository commentRepository; 37 private final PostingService postingService; 38 39 40// 記事情報を全件検索(新着順) 41 @RequestMapping(path = "/newSort") 42 public String newSort(Model model, Pageable pageable, Integer postingId) throws Exception { 43 Posting posting = new Posting(); 44 // セッションにカテゴリIDが保存されている場合は取得 45 try { 46 if (session.getAttribute("sortPostingId") != null) { 47 48 postingId = (Integer) session.getAttribute("sortPostingId"); 49 // カテゴリ情報をセット 50 posting.setId(postingId); 51 } 52 53 } catch (Exception e) { 54 // nullの場合は検索から取得し記事IDを使用 55 posting.setId(postingId); 56 } 57 58// List<Posting> postingList = postingRepository.findByOrderByInsertDateAsc(); 59 List<Posting> postingList = postingService.findAllByInsertDateAsc(); 60 61// postingList= postingService.getPostingsInNewOrder(postingList); 62 63 // 記事情報をViewへ渡す 64 model.addAttribute("posting", postingList); 65 model.addAttribute("sortNumber", 2); 66 return "index/index"; 67 }

java(エンティティ)

1package jp.co.entity; 2 3import java.time.LocalDateTime; 4 5import javax.persistence.Column; 6import javax.persistence.Entity; 7import javax.persistence.GeneratedValue; 8import javax.persistence.GenerationType; 9import javax.persistence.Id; 10import javax.persistence.Table; 11 12import org.springframework.format.annotation.DateTimeFormat; 13 14import lombok.Getter; 15import lombok.Setter; 16 17@Getter 18@Setter 19@Entity 20@Table(name = "posting") 21public class Posting { 22 23 @Id 24 @GeneratedValue(strategy = GenerationType.IDENTITY) 25 private int id; 26 27 @DateTimeFormat(pattern = "dd/MM/yyyy") 28 private LocalDateTime insertDate; 29// @Temporal(TemporalType.TIMESTAMP) 30 31 @Column 32 private String contents; 33 34 @Column 35 private String title; 36 37} 38

java(サービスクラス)

1 2import java.util.Collections; 3import java.util.List; 4 5import org.springframework.data.domain.Sort; 6import org.springframework.stereotype.Service; 7 8import jp.co.x.entity.Posting; 9import jp.co.x.repository.PostingRepository; 10 11@Service 12public class PostingService { 13 private final PostingRepository postingRepository; 14 15 public PostingService(PostingRepository postingRepository) { 16 this.postingRepository = postingRepository; 17 } 18public List<Posting> findAllByInsertDateAsc() { 19 Sort sort = Sort.by("insertDate").ascending(); 20 return postingRepository.findAll(sort); 21 } 22}

thymleaf

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org" 3 th:replace="~{common/layout2 :: layout(~{::body/content()})}"> 4<head> 5 6<meta charset="UTF-8" /> 7<title>Test</title> 8</head> 9<body> 10 <h3 >Test</h3> 11 <p class="error" th:text="${errMessage}"></p> 12 13 <div>記事一覧</div> <div class="posting_sort"> 14 <span>並び替え</span> 15 <th:block th:if="${sortNumber == 2}"> 16 <a >新着順</a></th:block> 17 <th:block th:if="${sortNumber != 2}"> 18 <a href="/newSort">新着順</a></th:block> 19 20 </div> 21 22 <table> 23 <tr> 24 <th>投稿日</th> 25 <th>タイトル</th> 26 <th>投稿内容</th> 27 <th>コメント一覧</th> 28 <th:block th:if="${session.usersAuthority == 2}"> 29 <th>コメント投稿</th></th:block> 30 <th:block th:unless="${session.users == 0}"> 31 <th>コメント投稿</th></th:block> 32 </tr> 33 <tr th:each="posting: ${session.posting}"> 34 35 <!-- <td style="text-align: center;" th:text="${#dates.format(posting.insertDate, 'yyyy/MM/dd/hh:mm')}"></td> --> 36 <td style="text-align: center;" th:text="${#temporals.format(posting.insertDate, 'yyyy/MM/dd HH:mm')}"></td> 37 <td style="text-align: center;" th:text="${posting.title}"></td> 38 <td style="text-align: center;" th:text="${posting.contents}"></td> 39 40 <td> 41 <div style="text-align: center;"> 42 <form th:action="@{/comment/list/{id}(id=${posting.id})}"> 43 <input type="submit" value="この記事のコメントを見る" /> 44 </form> 45 </div> 46 </td> 47 48 <!-- コメントするボタン(ログインした場合のみ表示) --> 49 <th:block th:if="${session.users}"> 50 <dd class="link_area"> 51 <td><form action="/snssns/commentPage"> 52 <div style="text-align: center;"> 53 <input type="hidden" name="id" th:value="${posting.id}" /> <input 54 type="submit" value="コメントする" /> 55 </div> </form></td> 56 57 </th:block>

Repository

1import java.util.List; 2 3import org.springframework.data.domain.Sort; 4import org.springframework.data.jpa.repository.JpaRepository; 5 6import jp.co.x.x.entity.Posting; 7 8public interface PostingRepository extends JpaRepository<Posting, Integer> { 9 10 11// 記事情報を新着順で検索 12// @Query("SELECT pos FROM Posting pos WHERE pos.date >= :date1 AND pos.date < :date2") 13 14// List<Posting> findByMonth(@Param("date1") Date date1, @Param("date2") Date date2); 15 // @Query(value = "select 'p.insert_date'" + "from sns_posting p order by 'p.insert_date' desc", nativeQuery = true) 16 List<Posting> findByMonth(); 17// public List<Posting> findByOrderByInsertDateAsc(); 18 List<Posting> findAll(Sort sort); 19}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

検索+char gptでも聞いてみて、以下試してみたがうまくいきませんでした。
public List<Posting> findAllByOrderByInsertDateAsc()を使用。
List<Posting> findAll(Sort sort)を使用。
@Query(value = "select 'p.insert_date'" + "from sns_posting p order by 'p.insert_date' desc", nativeQuery = true)

補足

バージョン:JDK8、spring boot 2.6

postingテーブル
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| insert_date | TIMESTAMP(6) | NO | | NULL| |
| contents | varchar(45) | NO | | NULL | |
| title | varchar(45) | NO| | NULL | |
| user_id | int(11) | NO | | NULL | |FK
+-------------+----------+------+-----+---------+----------------+

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

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

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

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

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

guest

回答1

0

ベストアンサー

動作確認はしていませんが、日付を降順(DESC)にすると、日付が新しい順で取得できると思います。

java

1// PostingService.java(sortを使う場合) 2Sort sort = Sort.by("insertDate").descending(); 3postingRepository.findAll(sort); 4 5// PostingRepository.java(クエリを使う場合) 6List<Posting> findAllByOrderByInsertDateDesc();

追記

thymleafのコードが「session.posting」を参照しているので、以下の方がよろしいかもしれません。(表示データは最新データを取得する必要があるため、セッションに登録&取得しないことをオススメします)

java(PostingController)

1// 記事情報をViewへ渡す 2// model.addAttribute("posting", postingList); 3model.addAttribute("postings", postingList);

html

1<!-- <tr th:each="posting: ${session.posting}"> --> 2<tr th:each="posting: ${postings}"> 3 <!-- 記事一覧を表示 -->

また、新着順を実装する場合、一般的にURLのパラメータを使うことが多いので、セッションよりもオススメとなっております。
※例えばAmazonの場合、「s=date-desc-rank」というパラメーターを付けると、新着商品の並び替えができます
https://www.amazon.co.jp/s?k=iphone&s=date-desc-rank
※「k=iphone」が「keyword=iphone」で、「s=date-desc-rank」が「sort=date-desc-rank」という意味になっています

投稿2024/01/17 11:16

編集2024/01/21 09:53
KT001

総合スコア618

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

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

dwdwdw

2024/01/20 03:02

返信遅くなり申し訳ございません。 回答ありがとうございます。試してみましたが解決できませんでした。 また、Ascの場合でも日付が古い順で並び替えができませんでした。。 この場合どの辺りに原因がありそうでしょうか?
KT001

2024/01/20 05:09

表示自体ができているのであれば、insertDateに登録されている日付が正しいか確認すると、原因が分かるかもしれません。 また、気になった点を追記させて頂きました。
dwdwdw

2024/01/24 12:58

再び返信遅くなり申し訳ございません。回答ありがとうございます。 試したところ問題が解決しました! thymleaf側がsessionで表示されるようになっており、コントローラー側で並び替えの検索結果をmodelに入れていたため表示されなかったようでした。 また、URL設計?についても教えていただきありがとうございます。 とても助かりました。ちなみにURL設計はどんな書籍、サイト等で学べばよいなどおすすめありますでしょうか? そしてベストアンサーに選ばせていただきました。ありがとうございました。
KT001

2024/01/28 05:36

こちらこそ、返信が遅れて申し訳ありません。URL設計については、色々とWebアプリを作っていくと学んでいけると思います。書籍に関しては、以下を紹介させて頂きます。 https://www.amazon.co.jp/dp/B0893LQ5KY/ 解決して良かったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問