Spring DataのExistsクエリ

1. 前書き

多くのデータ中心のアプリケーションでは、特定のオブジェクトが既に存在するかどうかを確認する必要がある場合があります。
このチュートリアルでは、Spring DataとJPAを使用してそれを正確に実現するいくつかの方法について説明します。

2. サンプルエンティティ

サンプルのステージを設定するには、2つのプロパティ__model ___and _power_を持つエンティティ_Car_を作成しましょう。
@Entity
public class Car {

    @Id
    @GeneratedValue
    private int id;

    private Integer power;
    private String model;

    // getters, setters, ...
}

3. IDで検索

_JpaRepository_インターフェイスは、指定された_id_を持つエンティティがデータベースに存在するかどうかを確認する_existsById_メソッドを公開します。
int searchId = 2; // ID of the Car
boolean exists = repository.existsById(searchId)
_searchId_が、テストのセットアップ中に作成した_Car_の_id_であると仮定しましょう。 テストの再現性のため、a _Car_の_id_プロパティは自動生成され、時間とともに変化する可能性があるため、ハードコードされた数値(たとえば、「2」)を使用しないでください。 * _existsById_クエリは、オブジェクトの存在をチェックする最も簡単ですが、柔軟性が最も低い方法です*。

4. 派生クエリメソッドの使用

Springの派生クエリメソッド機能を使用して、クエリを作成することもできます。 この例では、特定のモデル名を持つa _Car_が存在するかどうかを確認するため、次のクエリメソッドを考案します。
boolean existsCarByModel(String model);
*メソッドの命名は任意ではないことに注意することが重要です。特定のルールに従う必要があります*。 その後、Springはリポジトリのプロキシを生成し、メソッドの名前からSQLクエリを取得できるようにします。 IntelliJ IDEAのような最新のIDEは、そのための構文補完を提供します。
たとえば、順序付け、結果の制限、およびいくつかのクエリ条件を組み込むことで、クエリがより複雑になると、*これらのメソッド名は非常に長くなり、判読不能になる*。 また、派生クエリメソッドは、暗黙的で「慣例により」性質があるため、魔法のように見える場合があります。
それでも、クリーンで整頓されたコードが重要であり、開発者が十分にテストされたフレームワークに依存したい場合に便利です。

5. _例_による検索

_Example_は、_ExampleMatchers_を使用してクエリを動的に構築するため、存在を確認する非常に強力な方法です。 したがって、動的性が必要なときはいつでも、これがそれを行うための良い方法です。 Spring __ExampleMatcher__sの包括的な説明とその使用方法については、https://www.baeldung.com/spring-data-query-by-example [Spring Data Query]の記事をご覧ください。

5.1. マッチャー

大文字と小文字を区別しない方法でモデル名を検索するとします。 _ExampleMatcher_を作成することから始めましょう。
ExampleMatcher modelMatcher = ExampleMatcher.matching()
  .withIgnorePaths("id")
  .withMatcher("model", ignoreCase());
__id __が主キーであり、これらはデフォルトで自動的に取得されるため、_id_パスを明示的に無視する必要があることに注意してください。

5.2. プローブ

次に、いわゆる「プローブ」を定義する必要があります。これは、検索するクラスのインスタンスです。 すべての検索関連プロパティが設定されています。 次に、それを_nameMatcher_に接続し、クエリを実行します。
Car probe = new Car();
probe.setModel("bmw");
Example<Car> example = Example.of(probe, modelMatcher);
boolean exists = repository.exists(example);
柔軟性が非常に高いため、_ExampleMatcher_ APIと同じくらい強力ですが、それを使用すると、かなりの数の余分なコード行が生成されます。 *これを動的クエリで使用するか、他の方法がニーズに合わない場合*を使用することをお勧めします。

6. Exists Semanticsを使用したカスタムJPQLクエリの作成

最後に検証する方法では、JPQL(Java Persistence Query Language)を使用して、exists __–__ semanticsを使用してカスタムクエリを実装します。
@Query("select case when count(c)> 0 then true else false end from Car c where lower(c.model) like lower(:model)")
boolean existsCarLikeCustomQuery(@Param("model") String model);
考え方は、_model_プロパティに基づいて大文字と小文字を区別しない_count_クエリを実行し、戻り値を評価し、その結果をJava * _ * boolean * ._にマッピングすることです。繰り返しますが、ほとんどのIDEはJPQLステートメントをかなりサポートしています。
link:/spring-data-jpa-query [カスタムJPQLクエリ]は派生メソッドの代替として見ることができ、SQLのようなステートメントに慣れており、追加の_ @ Query_注釈に注意してください。

7. 結論

このチュートリアルでは、Spring DataとJPAを使用してデータベースにオブジェクトが存在するかどうかを確認する方法を見ました。 どの方法を使用するかは、手元のユースケースと個人的な好みに大きく依存するため、厳密なルールはありません。
しかし、経験則として、開発者は、堅牢性、パフォーマンス、およびコードの明快さの理由から、より簡単な方法に常に傾倒する必要があります。 また、派生クエリまたはカスタムJPQLクエリのいずれかを決定したら、コーディングスタイルの一貫性を確保するために、できるだけ長くその選択を維持することをお勧めします。
完全なソースコードの例は、https://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-jpa-2 [Github]にあります。