JPQLのLIKE演算子を使った部分一致検索の方法を解説
新人
「先輩、JPQLのLIKE演算子ってどう使うんですか?部分一致検索ができると聞いたのですが、よくわからなくて…」
先輩
「いい質問ですね。JPQLのLIKE演算子を使うと、文字列の一部が一致するデータを検索できますよ。基本から一緒に見ていきましょう!」
1. JPQLとは?(基本的な説明)
JPQL(Java Persistence Query Language)は、Javaの永続化フレームワークであるJPA(Java Persistence API)で使われるクエリ言語です。SQLに似ていますが、テーブルではなくエンティティ(Javaのクラス)を対象にしている点が特徴です。
例えば、データベースの「users」テーブルに対応する「User」エンティティがある場合、JPQLを使って「User」エンティティに対して検索や更新を行います。
JPQLを使うことで、データベースに依存しない柔軟なクエリを記述でき、オブジェクト指向の考え方でデータ操作が可能になります。
2. JPQLのLIKE演算子とは?(基本的な仕組みと使い方)
JPQLのLIKE演算子は、文字列の部分一致検索を行うための演算子です。SQLのLIKEと同様に、ワイルドカードを使って柔軟な検索が可能です。
主に使用するワイルドカードは以下の2つです:
%:任意の文字列(0文字以上)に一致_:任意の1文字に一致
例えば、名前が「田中」で始まるユーザーを検索する場合、以下のように記述します。
@Query("SELECT u FROM User u WHERE u.name LIKE :name")
List<User> findByNameLike(@Param("name") String name);
このとき、メソッドを呼び出す際に引数として「田中%」を渡すと、「田中」で始まる名前のユーザーが取得できます。
また、名前に「中」が含まれるユーザーを検索する場合は、「%中%」を渡します。
このように、LIKE演算子とワイルドカードを組み合わせることで、柔軟な部分一致検索が可能になります。
3. JPQLのLIKE演算子を使った部分一致検索の基本的な書き方
それでは、JPQLのLIKE演算子を使った基本的な部分一致検索の書き方を見ていきましょう。JPQLでは、SQLと同じようにLIKEを使いますが、対象はテーブルではなく、エンティティになります。部分一致検索をしたいときには、WHERE句の条件にLIKEを入れて書きます。
例えば、「User」というエンティティのnameフィールドに「山田」という文字が含まれるデータを探す場合、以下のように書きます。
@Query("SELECT u FROM User u WHERE u.name LIKE :name")
List<User> findByNameLike(@Param("name") String name);
この例では、:name という部分にワイルドカードを含んだ検索条件を指定します。例えば、「%山田%」のように、前後に%をつけると「山田」を含むすべてのデータが検索されます。
4. JPQLのLIKE演算子を使うときのワイルドカード(%や_など)の使い方
JPQLのLIKE演算子を使うときには、%と_というワイルドカードが大切な役割を持っています。%は「0文字以上の任意の文字列」、_は「任意の1文字」を表します。
例えば、次のように条件を指定することで、さまざまな部分一致検索ができます。
%田中%:文字列の中に「田中」が含まれるデータをすべて探す田中%:文字列が「田中」で始まるデータを探す%田中:文字列が「田中」で終わるデータを探す田_中:例えば「田一中」や「田A中」など、間に1文字だけ違う文字が入るデータを探す
これらを使うことで、必要な情報を柔軟に探すことができます。部分一致検索を活用するために、どんなときに%や_を使うかを覚えておくと便利です。
5. JPQLのLIKE演算子を使った簡単なサンプルコード
それでは、実際にJPQLのLIKE演算子を使った部分一致検索のサンプルコードを紹介します。ここでは、Springの@Controllerを使い、Pleiadesで作成したプロジェクトでの例です。
@Controller
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/search")
public String searchUsers(@RequestParam("keyword") String keyword, Model model) {
// 部分一致検索を行う
String searchKeyword = "%" + keyword + "%";
List<User> users = userRepository.findByNameLike(searchKeyword);
model.addAttribute("users", users);
return "userList";
}
}
この例では、ユーザーが入力した検索キーワードを受け取り、findByNameLikeメソッドを呼び出しています。キーワードの前後に%をつけることで、部分一致検索が行われます。
また、結果をModelに入れてビューに表示しています。これにより、検索結果がユーザーにわかりやすく見えるようになります。
このように、JPQLのLIKE演算子を使えば、簡単に部分一致検索ができます。Springの@Controllerを使うことで、Web画面と組み合わせて検索機能を作ることができるのです。
6. JPQLのLIKE演算子を使うときの注意点(大文字小文字の扱いなど)
JPQLのLIKE演算子を使用する際には、いくつかの注意点があります。特に、大文字と小文字の扱いについて理解しておくことが重要です。
デフォルトでは、JPQLのLIKE演算子は大文字と小文字を区別します。つまり、「Tanaka」と「tanaka」は異なるものとして扱われます。そのため、大文字小文字を区別せずに検索を行いたい場合は、文字列を変換する必要があります。
例えば、以下のようにLOWER関数を使用して、検索対象と検索キーワードの両方を小文字に変換することで、大文字小文字を区別しない検索が可能になります。
@Query("SELECT u FROM User u WHERE LOWER(u.name) LIKE LOWER(CONCAT('%', :name, '%'))")
List<User> findByNameIgnoreCase(@Param("name") String name);
このようにすることで、「Tanaka」や「tanaka」、「TANAKA」など、さまざまな表記の名前を一括で検索することができます。
7. JPQLのLIKE演算子を使った検索結果の表示例
実際に、JPQLのLIKE演算子を使用して検索を行った場合の結果表示例を見てみましょう。以下は、ユーザー名に「田中」が含まれるデータを検索し、その結果を表示する例です。
@Controller
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/search")
public String searchUsers(@RequestParam("keyword") String keyword, Model model) {
String searchKeyword = "%" + keyword + "%";
List<User> users = userRepository.findByNameLike(searchKeyword);
model.addAttribute("users", users);
return "userList";
}
}
このコントローラーでは、検索キーワードを受け取り、findByNameLikeメソッドを使用して部分一致検索を行っています。検索結果はModelに追加され、ビューで表示されます。
ビュー側では、以下のように検索結果を表示することができます。
<table>
<tr>
<th>ID</th>
<th>名前</th>
</tr>
<tr th:each="user : ${users}">
<td th:text="${user.id}"></td>
<td th:text="${user.name}"></td>
</tr>
</table>
このようにすることで、検索結果を表形式で表示することができます。
8. JPQLのLIKE演算子を学ぶおすすめの方法
JPQLのLIKE演算子を効果的に学ぶためには、以下の方法がおすすめです。
- 公式ドキュメントの活用:Spring Data JPAやJPAの公式ドキュメントには、LIKE演算子の使用方法や注意点が詳しく記載されています。まずはこれらのドキュメントを読み、基本的な知識を身につけましょう。
- サンプルコードの実装:実際に手を動かして、簡単な検索機能を実装してみましょう。例えば、ユーザー名で検索する機能を作成することで、LIKE演算子の使い方を実践的に学ぶことができます。
- チュートリアルの活用:オンラインには、JPQLやSpring Data JPAに関するチュートリアルが多数存在します。これらを活用して、より深い理解を目指しましょう。
- エラーハンドリングの学習:LIKE演算子を使用する際には、予期しないエラーが発生することもあります。例えば、検索キーワードがnullの場合などです。これらのケースに対応する方法を学ぶことで、より堅牢なアプリケーションを作成することができます。
これらの方法を組み合わせて学習を進めることで、JPQLのLIKE演算子を効果的に習得することができます。
まとめ
JPQLのLIKE演算子を使った部分一致検索は、文字列を柔軟に検索できる非常に便利な仕組みです。とくに、ユーザー名や商品名などのあいまい検索が求められる場面では、ワイルドカードである「%」や「_」を適切に組み合わせることで、幅広い検索条件に対応できます。さらに、JPQLはエンティティを対象に操作するため、Javaのオブジェクトに寄り添った形でデータベース操作ができる点も大きな利点です。今回の記事では、LIKE演算子の基本的な動作、ワイルドカードの意味、前方一致や後方一致、部分一致などの具体的な検索方法、そしてSpring Data JPAと組み合わせた実装例まで順を追って学びました。
LIKE演算子は便利な一方で、大文字小文字の扱いに注意が必要です。JPQLでは大文字小文字が区別されるため、そのまま検索すると「Tanaka」と「tanaka」が異なる値として扱われます。このようなケースではLOWER関数を活用することで、表記揺れに影響されない検索を実現できます。また、検索キーワードがnullであったり、入力された文字列に不要な空白が含まれたりすると、期待どおりの検索結果が得られないこともあります。こうした点を踏まえ、入力チェックや例外処理をしっかり行うことが堅牢なアプリケーションづくりにつながります。
Webアプリケーションとして検索画面を作る際には、検索結果をテーブル形式で表示することで、ユーザーが直感的に結果を把握しやすくなります。Springの@ControllerとModelを組み合わせて検索結果をビューに渡し、Thymeleafなどのテンプレートエンジンで一覧表示する構成は、シンプルでありながら多くのWebアプリケーションで採用されている標準的な手法です。
JPQLのLIKE演算子は、基本を押さえておけばすぐに実践できる技術ですが、よりスムーズに理解を深めるためには、実際に手を動かしてコードを書き、動きを確かめることが最も効果的です。サンプルプログラムを少しずつアレンジし、自分の検索条件を増やしたり、画面側の表示形式を工夫したりすることで、さらに深い知識を身につけることができます。ここでは、今回学んだ内容を振り返りつつ、部分一致検索のポイントをまとめたサンプルも紹介しますので、参考にしながら理解を深めてください。
サンプルプログラムの振り返り
以下は、今回の学習内容をベースにしたJPQLのLIKE演算子による部分一致検索の応用サンプルです。
@Controller
public class UserSearchController {
@Autowired
private UserRepository userRepository;
@GetMapping("/keyword-search")
public String keywordSearch(@RequestParam("word") String word, Model model) {
// 大文字小文字を区別しない部分一致検索にする
String formatted = "%" + word.toLowerCase() + "%";
List<User> result = userRepository.findByNameIgnoreCase(word);
model.addAttribute("users", result);
return "userSearchResult";
}
}
このサンプルではLOWER関数を使った大文字小文字を区別しない検索を利用しています。ユーザーが入力したキーワードを小文字に変換し、前後に「%」を付けることで柔軟な検索が可能になります。また、検索結果をModelに詰めてビューへ渡す構成も、実践で役立つ基本的な流れとして理解しておくと便利です。
生徒
「先生、JPQLのLIKE演算子って思っていたより使いやすかったです。ワイルドカードの仕組みも覚えやすいですね。」
先生
「そうですね。ワイルドカードを覚えると、一気に検索の幅が広がりますよ。部分一致検索はWebアプリではよく使われる機能なので、しっかり理解しておくと必ず役に立ちます。」
生徒
「LOWER関数で大文字小文字を区別しない検索ができるのも便利だと思いました。実務でもよく使うんですか?」
先生
「はい、多くのプロジェクトで使われています。ユーザー名や商品名は表記が揺れることがあるので、小文字に統一して検索するのは実務の定番ですね。」
生徒
「なるほど…入力がnullだった場合の注意点やエラーハンドリングも理解できてきました。実際にコードを書いて試してみます!」
先生
「とても良い姿勢ですね。検索機能は実際に手を動かしてみることで理解が深まります。部分一致検索をしっかり身につけて、次のステップにも挑戦していきましょう。」