カテゴリ: SpringのDB操作 更新日: 2026/03/26

JPQLのIN句を使った複数条件検索の方法を解説

JPQLのIN句を使った複数条件検索の方法
JPQLのIN句を使った複数条件検索の方法

新人と先輩の会話形式で理解しよう

新人

「先輩、JPQLのIN句ってどう使うんですか?複数の条件で検索したいんですけど、方法がわからなくて…」

先輩

「JPQLのIN句を使えば、複数の値に一致するデータを簡単に検索できますよ。基本から一緒に見ていきましょう!」

1. JPQLとは?(基本的な説明)

1. JPQLとは?(基本的な説明)
1. JPQLとは?(基本的な説明)

JPQL(Java Persistence Query Language)は、Javaの永続化フレームワークであるJPA(Java Persistence API)で使用されるクエリ言語です。SQLに似ていますが、テーブルではなくエンティティ(Javaのクラス)を対象にしている点が特徴です。

例えば、データベースの「users」テーブルに対応する「User」エンティティがある場合、JPQLを使って「User」エンティティに対して検索や更新を行います。

JPQLを使うことで、データベースに依存しない柔軟なクエリを記述でき、オブジェクト指向の考え方でデータ操作が可能になります。

2. JPQLのIN句とは?(基本的な仕組みと役割)

2. JPQLのIN句とは?(基本的な仕組みと役割)
2. JPQLのIN句とは?(基本的な仕組みと役割)

JPQLのIN句は、指定した複数の値の中にフィールドの値が含まれているかをチェックするための演算子です。SQLのIN句と同様に、複数の条件を一度に指定して検索することができます。

例えば、特定のIDを持つユーザーを検索したい場合、以下のように記述します。


@Query("SELECT u FROM User u WHERE u.id IN :ids")
List<User> findByIdIn(@Param("ids") List<Long> ids);

この例では、:idsにリスト形式でIDを渡すことで、複数のIDに一致するユーザーを一度に取得できます。

3. JPQLのIN句を使った複数条件検索の基本的な書き方

3. JPQLのIN句を使った複数条件検索の基本的な書き方
3. JPQLのIN句を使った複数条件検索の基本的な書き方

JPQLのIN句を使った複数条件検索の基本的な書き方を見ていきましょう。IN句を使うことで、複数の値に一致するデータを一度に検索できます。まず、基本的な文法としては、WHERE フィールド名 IN :パラメータという形で記述します。例えば、複数のステータスに一致するユーザーを検索したい場合、以下のように書きます。


@Query("SELECT u FROM User u WHERE u.status IN :statuses")
List<User> findByStatusIn(@Param("statuses") List<String> statuses);

この例では、:statusesというパラメータに複数のステータス値をリスト形式で渡すことで、該当するユーザーをまとめて取得できます。JPQLのIN句は、条件が複数ある場合にとても便利です。

JPQLでは、実際のSQLのようにカラム名ではなく、エンティティのフィールド名を使うことがポイントです。エンティティのフィールド名を正確に指定するように気をつけましょう。

4. JPQLのIN句を使うときの具体的な使い方

4. JPQLのIN句を使うときの具体的な使い方
4. JPQLのIN句を使うときの具体的な使い方

次に、JPQLのIN句を実際に使うときの流れを見ていきましょう。まず、Springの@Controllerクラスでユーザーから検索条件を受け取り、JPQLのIN句を使って検索を行います。Gradleで構築したプロジェクトでは、pleiadesでプロジェクトを作成し、Springの依存関係を追加してから進めてください。

以下に、具体的なステップを示します。

ステップ1:検索条件をリクエストパラメータとして受け取ります。

ステップ2:JPQLのIN句を使ったリポジトリのメソッドを呼び出します。

ステップ3:取得したデータを画面に返します。

例えば、ユーザーが複数のステータスを指定して検索したい場合、以下のように進めます。

まず、検索用のフォームなどでユーザーから複数のステータスを受け取る想定です。Springの@Controllerクラスでは、@RequestParamを使って複数の値をリスト形式で受け取ることができます。

以下にサンプルコードを紹介します。


@Controller
public class UserController {

    private final UserRepository userRepository;

    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @GetMapping("/users/search")
    public String searchUsers(@RequestParam("statuses") List<String> statuses, Model model) {
        List<User> users = userRepository.findByStatusIn(statuses);
        model.addAttribute("users", users);
        return "userList";
    }
}

この例では、@RequestParam("statuses")で複数のステータスをリスト形式で受け取っています。そして、リポジトリのfindByStatusInメソッドを呼び出して、該当するユーザーのリストを取得しています。

IN句のパラメータには、必ずリスト形式で値を渡すようにしましょう。複数の値を受け取る場合、List<String>List<Long>などのリスト形式が必要です。

5. JPQLのIN句を使った簡単なサンプルコード

5. JPQLのIN句を使った簡単なサンプルコード
5. JPQLのIN句を使った簡単なサンプルコード

最後に、JPQLのIN句を使った簡単なサンプルコードをまとめて紹介します。今回の例では、ユーザーエンティティを例にして、複数のIDに一致するユーザーを検索するサンプルを用意しました。

以下は、pleiadesで作成したSpringプロジェクトの一部として、Gradleで依存関係を管理し、@Controllerを使ったサンプルコードです。


// User.java
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String status;

    // getter, setterなどのメソッド
}

// UserRepository.java
public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT u FROM User u WHERE u.id IN :ids")
    List<User> findByIdIn(@Param("ids") List<Long> ids);

    @Query("SELECT u FROM User u WHERE u.status IN :statuses")
    List<User> findByStatusIn(@Param("statuses") List<String> statuses);
}

// UserController.java
@Controller
public class UserController {

    private final UserRepository userRepository;

    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @GetMapping("/users/searchByIds")
    public String searchByIds(@RequestParam("ids") List<Long> ids, Model model) {
        List<User> users = userRepository.findByIdIn(ids);
        model.addAttribute("users", users);
        return "userList";
    }

    @GetMapping("/users/searchByStatuses")
    public String searchByStatuses(@RequestParam("statuses") List<String> statuses, Model model) {
        List<User> users = userRepository.findByStatusIn(statuses);
        model.addAttribute("users", users);
        return "userList";
    }
}

このサンプルでは、UserRepositoryでJPQLのIN句を使って複数条件の検索を行うメソッドを用意しています。そして、UserControllerでそのメソッドを呼び出し、取得したユーザーリストをuserListビューに渡しています。

このように、pleiadesを使って作成したSpringプロジェクトでJPQLのIN句を活用すれば、複数条件に一致するデータを簡単に検索できます。Gradleで依存関係を管理することで、必要なライブラリを簡単に導入でき、効率的に開発を進めることが可能です。

初心者の方は、まずは小さな例から試してみて、JPQLのIN句がどのように動作するのかを確認すると良いでしょう。複雑な検索条件を扱う場合でも、IN句をうまく使えばシンプルな記述で実現できます。ぜひ実際に試してみてくださいね!

6. JPQLのIN句を使うときの注意点

6. JPQLのIN句を使うときの注意点
6. JPQLのIN句を使うときの注意点

ここまでで、JPQLのIN句を使った複数条件検索の基本的な書き方や実装例を学びましたが、実際に開発を進めるときにはいくつか注意すべきポイントがあります。初心者の方にも分かりやすく説明しますので、一緒に確認していきましょう。

まず、IN句に渡すリストが空の場合です。もしリストが空のままクエリを実行すると、データベースによってはエラーが発生することがあります。そのため、IN句のパラメータに渡すリストは必ず空ではないことを確認しましょう。コントローラでリストのサイズをチェックし、空の場合は別の処理に分岐するなどの工夫が必要です。

次に、IN句に渡す値が大量になる場合です。JPQLのIN句に数百件以上の値を渡すと、データベースへの負荷が大きくなり、パフォーマンスが低下することがあります。大量の条件を指定する必要がある場合は、検索条件を絞り込む工夫をするか、別の検索方法を検討するのがおすすめです。

さらに、JPQLではエンティティのフィールド名を正しく指定する必要があります。SQLのカラム名と混同しないように注意してください。例えば、Userエンティティに「status」というフィールドがあっても、間違ってテーブルのカラム名「user_status」などを書いてしまうと、クエリが正しく動かなくなります。

このように、JPQLのIN句を使うときは、渡すリストが空でないこと、パフォーマンス面の注意、エンティティのフィールド名の正確さなどに気をつけて開発を進めましょう。

7. JPQLのIN句を使った検索結果の表示例

7. JPQLのIN句を使った検索結果の表示例
7. JPQLのIN句を使った検索結果の表示例

それでは、JPQLのIN句を使った検索結果を実際に画面に表示する流れを具体的に見ていきましょう。今回は、pleiadesで構築したSpringの@Controllerを使った例を紹介します。検索結果をModelに追加し、ビューに渡して表示します。

例えば、複数のステータスを条件にユーザーを検索する画面があるとします。以下のように、ビューではth:eachを使って結果を一覧表示できます。


<!-- userList.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>ユーザー検索結果</title>
</head>
<body>
    <h1>ユーザー検索結果</h1>
    <table border="1">
        <tr>
            <th>ID</th>
            <th>名前</th>
            <th>ステータス</th>
        </tr>
        <tr th:each="user : ${users}">
            <td th:text="${user.id}"></td>
            <td th:text="${user.name}"></td>
            <td th:text="${user.status}"></td>
        </tr>
    </table>
</body>
</html>

このように、Springの@Controllerで検索結果をModelに格納し、Thymeleafのビューで表示する仕組みです。ビューには、JPQLのIN句を使って取得したデータが一覧として反映されます。

また、検索フォームを作成して、複数の条件を指定して検索できるようにすることで、ユーザーの利便性も高まります。例えば、ステータスを選択するチェックボックスを用意して、選択された条件をコントローラに渡す形です。実際の開発では、検索条件の指定方法も工夫して、使いやすい画面を作成していきましょう。

8. JPQLのIN句を学ぶおすすめの方法

8. JPQLのIN句を学ぶおすすめの方法
8. JPQLのIN句を学ぶおすすめの方法

最後に、JPQLのIN句を学ぶときにおすすめの方法を紹介します。初心者の方でも楽しく学べるように、具体的なステップをまとめました。

まずは、簡単なサンプルコードを自分で書いて動かしてみることです。実際にpleiadesを使って、Gradleでプロジェクトを作成し、サンプルのリポジトリやコントローラを試してみてください。小さな例でも、実際に動かすことで理解が深まります。

次に、Springの公式ドキュメントを読むことも大切です。JPQLの基本的な書き方やIN句の使い方について詳しく解説されています。公式ドキュメントは初心者にとって難しい部分もありますが、わからない単語を調べながら読むことで、少しずつ理解が進みます。

また、チュートリアル形式の書籍やWeb記事を活用するのもおすすめです。具体的なコード例が豊富に載っている書籍や、初心者向けの記事を参考にすることで、実際の開発に近い形で学習を進めることができます。

さらに、チームの先輩や同僚に質問するのも大切です。自分だけでは気づかないポイントを教えてもらえるので、学びの幅が広がります。Springの@Controllerを使った開発例や、JPQLのIN句を使った検索の実例を一緒に見せてもらうのも効果的です。

このように、JPQLのIN句を学ぶときは、実際に手を動かすこと、公式ドキュメントを読むこと、周囲の先輩に聞くことを組み合わせると、より実践的に学べます。ぜひ今回の記事を参考に、JPQLのIN句をマスターして、複雑な検索条件を自在に扱えるエンジニアを目指してください。

まとめ

まとめ
まとめ

ここまで、JPQLのIN句を使った複数条件検索について、基礎から実践的な使い方まで段階的に学んできました。JPQLは、JPAを利用したアプリケーション開発において欠かせないクエリ言語であり、その中でもIN句は、複数の条件をまとめて指定したい場面で非常に重要な役割を果たします。特に、SpringとJPAを組み合わせた開発では、ユーザー検索やステータス別の絞り込み、IDの一覧指定など、実務で頻繁に登場する機能をシンプルな記述で実現できる点が大きなメリットです。

JPQLのIN句は、SQLに慣れている方であれば比較的理解しやすい構文をしていますが、テーブルやカラムではなく、エンティティとフィールドを対象にしている点が最大の特徴です。この違いを正しく理解しないと、クエリが動作しなかったり、意図しない結果になったりするため注意が必要です。今回の記事では、Userエンティティを例にして、idやstatusといったフィールドを使った検索方法を紹介しましたが、これは他のエンティティにもそのまま応用できます。

また、IN句を使う際には、パラメータとしてリスト型を渡すことが基本になります。Spring Data JPAでは、@Queryアノテーションと@Paramを組み合わせることで、ListやSetといったコレクションを安全に受け取ることができます。コントローラ側でも、@RequestParamを使えば複数の値を簡単に受け取れるため、画面からの検索条件入力とバックエンドの処理をスムーズにつなげることができます。この一連の流れを理解することで、検索機能の実装に対する苦手意識も減っていくでしょう。

一方で、JPQLのIN句には注意点もありました。特に、空のリストを渡した場合の挙動や、大量の値を指定したときのパフォーマンス問題は、実際の開発現場でもよく直面します。コントローラで事前にチェックを行ったり、検索条件を分割したりするなど、状況に応じた工夫が求められます。単に動くコードを書くのではなく、将来的な保守性や性能まで意識することが、エンジニアとしての成長につながります。

さらに、検索結果の表示についても、Thymeleafを使った具体例を通して確認しました。JPQLのIN句で取得したデータをModelに格納し、ビューで一覧表示する流れは、Spring MVCの基本構造そのものです。この流れを理解しておくことで、検索機能だけでなく、登録、更新、削除といった他の機能にも応用が利くようになります。IN句は検索の一部ですが、その周辺の仕組みを含めて理解することが大切です。

JPQLのIN句を正しく使いこなせるようになると、複数条件検索をシンプルに記述できるようになり、コードの可読性も向上します。条件が増えても無理に複雑なロジックを書かずに済むため、後からコードを読む人にとっても理解しやすくなります。今回学んだ内容は、Spring BootやJPAを使った開発全般において、長く役立つ知識となるはずです。

まとめの中で確認するサンプルプログラム

ここで、JPQLのIN句を使った検索処理をもう一度シンプルな形で振り返ってみましょう。エンティティとリポジトリの基本形を確認することで、理解をより確かなものにできます。


@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String status;

    // getter と setter
}

public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT u FROM User u WHERE u.status IN :statuses")
    List<User> findByStatusIn(@Param("statuses") List<String> statuses);
}

このように、エンティティのフィールド名をそのまま使ってIN句を記述するのがJPQLの基本です。SQLとの違いを意識しながら書くことで、ミスを防ぐことができます。

先生と生徒の振り返り会話

生徒

「JPQLのIN句って、最初は難しそうに感じていましたけど、エンティティのフィールドを使うって分かると理解しやすくなりました。複数条件の検索がこんなに簡単に書けるんですね」

先生

「そうですね。IN句は、検索条件が増えたときほど効果を発揮します。Listで条件を渡せる点も、Spring Data JPAとの相性がとても良いです」

生徒

「空のリストを渡すとエラーになる可能性があるという話も印象に残りました。動くだけじゃなくて、安全に動くコードを書くことが大事なんですね」

先生

「その通りです。実務では、想定外の入力が必ず発生します。今回学んだ注意点を意識して実装すれば、より安定したアプリケーションになりますよ」

生徒

「検索結果をThymeleafで表示する流れも理解できました。JPQLのIN句は検索だけじゃなく、画面表示まで含めて考える必要があるんですね」

先生

「はい。データ取得から表示までを一連の流れとして捉えることが大切です。今回の内容を土台にして、さらに複雑な検索にも挑戦してみてください」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

JPQLとは何ですか?SQLとの違いを教えてください

JPQL(Java Persistence Query Language)は、JPAで使用されるクエリ言語で、SQLに似ていますが、テーブルではなくエンティティクラス(Javaのクラス)を対象とします。これにより、オブジェクト指向でデータを扱うことができ、データベースに依存しない柔軟な記述が可能です。

JPQLのIN句はどんな時に使いますか?

JPQLのIN句は、複数の条件を一度に指定して検索したいときに使います。例えば、複数のユーザーIDやステータスに一致するデータを取得する際に便利です。リスト形式で値を渡すことで、複数条件を簡単に扱えます。
コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
New1
Thymeleaf
Thymeleafのメリット・デメリットまとめ
New2
Spring認証(Spring Security)
フォーム認証とは?基本概念を完全ガイド!初心者でもわかる仕組み解説
New3
SpringのDB操作
JPQLのHAVING句(GROUP BY)の使い方や活用方法を初心者向けに解説!
New4
Spring認証(Spring Security)
ログイン成功・失敗時のリダイレクト処理を完全ガイド!初心者でもわかるSpring Securityの遷移設定
人気記事
No.1
Java&Spring記事人気No1
Springの基本
Spring Bootとは?初心者向けに役割とできることを徹底解説
No.2
Java&Spring記事人気No2
SpringのAPI開発(REST & GraphQL)
REST APIの主要なHTTPメソッド(GET, POST, PUT, DELETE)を初心者向けにわかりやすく解説!
No.3
Java&Spring記事人気No3
Springの基本
Spring Bootの依存関係管理を徹底解説!Maven・Gradleとスターターの仕組み
No.4
Java&Spring記事人気No4
SpringのDB操作
Spring Data JPAメソッド名クエリ完全ガイド!SQL不要のデータ操作
No.5
Java&Spring記事人気No5
Thymeleaf
Thymeleaf とは?初心者向けにThymeleafの基本を徹底解説
No.6
Java&Spring記事人気No6
Springの基本
Spring Boot入門!初心者でもわかるロギング設定とSLF4J・Logbackの使い方
No.7
Java&Spring記事人気No7
SpringのDB操作
Springで学ぶエンティティとDTOの基本!初心者でもわかるJavaデータ設計入門
No.8
Java&Spring記事人気No8
Spring認証(Spring Security)
セッション管理の基本(@SessionAttributes)を完全解説!初心者でもわかるセッションの仕組み