Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】การใช้ Spring Data JPA เพื่อค้นหาด้วยเงื่อนไขช่วงเวลา

2025年10月01日に「Dev.to」が公開したITニュース「การใช้ Spring Data JPA เพื่อค้นหาด้วยเงื่อนไขช่วงเวลา」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Spring Data JPAで日付範囲検索を行う方法を解説。記事クラスのpublishingDateフィールドに対し、CrudRepositoryを継承したリポジトリでfindByPublishingDateBetweenメソッドを使うと、開始日時と終了日時を含む範囲で効率的にデータを取得できる。今日の日付データ検索例も紹介する。

ITニュース解説

システムエンジニアを目指す上で、アプリケーション開発におけるデータベースの操作は避けて通れない重要なテーマである。特にJavaアプリケーション開発の分野では、Spring Data JPAという強力なツールが頻繁に利用されている。この記事では、Spring Data JPAを使って、データベースに保存されたデータの中から特定の期間に該当するものを効率的に検索する方法について解説する。

まず、Spring Data JPAとは何かを理解することから始める。JPAはJava Persistence APIの略で、Javaプログラムとリレーショナルデータベースの間でデータのやり取りを行うための標準的な仕様である。これは、データベースのテーブルのデータを、Javaのオブジェクトとして扱えるようにする「オブジェクト・リレーショナルマッピング(O/Rマッピング)」の仕組みを定めている。Spring Data JPAは、このJPAをSpringフレームワーク上でさらに使いやすくするためのプロジェクトであり、特にデータベース操作に関する記述量を大幅に削減し、開発効率を高めることを目的としている。

具体例として、「記事」を表すArticleというJavaのクラスを考える。このクラスは、データベースのArticleテーブルに対応し、各記事の情報を保持する。今回の記事で注目するのは、publishingDateというフィールドである。これは、記事がいつ公開されたかを示す日時を格納するもので、OffsetDateTimeというデータ型を使用している。OffsetDateTimeは、日付と時刻に加え、タイムゾーンのオフセット情報(UTCからの時差)も保持できるため、世界中で利用されるアプリケーションにおいて、時間の正確な管理に役立つ。例えば、未来の日時を設定することも可能である。

次に、このArticleクラスのデータをデータベースから取得したり、保存したりするためのインターフェースであるArticleRepositoryについて説明する。このArticleRepositoryは、CrudRepository<Article, Long>というインターフェースを継承している。CrudRepositoryはSpring Data JPAが提供する非常に便利なインターフェースで、「Create(作成)、Read(読み込み)、Update(更新)、Delete(削除)」という、データベース操作の基本的な機能をすでに定義している。つまり、ArticleRepositoryを定義するだけで、私たちは記事の保存、IDによる検索、全件取得、削除といった基本的な操作を行うメソッドを、自分で実装することなく利用できるようになるのだ。これは、開発者が繰り返し書く必要のある定型的なデータベース操作のコードを自動生成してくれるという、Spring Data JPAの大きなメリットの一つである。

Spring Data JPAのもう一つの強力な機能は、メソッドの命名規則に基づいて、自動的に複雑なデータベースクエリを生成してくれる点である。例えば、記事の作成者名(authorフィールドがあると仮定する)で記事を検索したい場合、findByAuthor(String author)という名前のメソッドをArticleRepositoryインターフェース内に宣言するだけでよい。するとSpring Data JPAは、このメソッド名から「Articleテーブルの中から、authorフィールドが指定された値と一致するレコードを検索する」というSQLクエリを自動的に生成し、その実装を提供してくれる。開発者はSQL文を直接書く手間を省き、Javaのコードだけでデータベース操作を直感的に記述できるのである。

今回の本題は、この命名規則を利用して、特定の期間内にある記事を検索する方法である。例えば、「ある開始日時からある終了日時までの間に公開された記事をすべて取得したい」という要件があった場合、どのようにメソッドを定義すればよいだろうか。Spring Data JPAでは、Betweenというキーワードをメソッド名に含めることで、期間検索のクエリを自動生成できる。具体的には、ArticleRepositoryインターフェースに次のようにメソッドを宣言する。

List<Article> findByPublishingDateBetween(OffsetDateTime fromDate, OffsetDateTime toDate);

このメソッドは、publishingDateフィールドがfromDatetoDateの間の日時であるArticleオブジェクトのリストを返してくれる。ここで重要なのは、Betweenキーワードが「inclusive(含む)」の検索を行うという点である。つまり、fromDatetoDateで指定した両方の時刻も検索結果に含まれる。SQLで言うところのWHERE publishingDate BETWEEN :fromDate AND :toDateと全く同じ動作をする。

この期間検索の機能を使って、例えば「今日公開されたすべての記事」を検索する場合を考えてみよう。今日の開始時刻と終了時刻を正確に指定する必要がある。JavaのOffsetDateTimeクラスを使うと、現在日時を基準にして、その日の最小時刻(午前0時0分0秒)と最大時刻(午後11時59分59.999999999秒)を簡単に取得できる。

1OffsetDateTime today = OffsetDateTime.now().with(LocalTime.MIN);
2OffsetDateTime todayMaxTime = OffsetDateTime.now().with(LocalTime.MAX);
3repository.findByPublishingDateBetween(today, todayMaxTime);

このコードでは、まずOffsetDateTime.now().with(LocalTime.MIN)によって、現在の日付における一日の開始時刻(例: 2023-10-27T00:00:00+09:00)を取得している。次にOffsetDateTime.now().with(LocalTime.MAX)によって、同じ日付における一日の終了時刻(例: 2023-10-27T23:59:59.999999999+09:00)を取得する。これらの開始時刻と終了時刻をfindByPublishingDateBetweenメソッドに渡すことで、今日一日の間に公開されたすべての記事が検索結果として得られるのである。

このように、Spring Data JPAを利用することで、開発者は複雑なSQLクエリを直接書くことなく、メソッドの命名規則に従うだけで、さまざまな条件でのデータ検索を効率的に実装できる。これはアプリケーション開発の生産性を大きく向上させるため、システムエンジニアを目指す上でぜひ習得しておくべき重要な技術である。特に日付や期間に関する検索は多くのアプリケーションで必要とされる機能であるため、このBetweenキーワードを使った期間検索の知識は実践で非常に役立つだろう。

関連コンテンツ