1. 序章

多くのデータ中心のアプリケーションでは、特定のオブジェクトがすでに存在するかどうかを確認する必要がある場合があります。

このチュートリアルでは、Spring DataとJPAを使用してそれを正確に実現するためのいくつかの方法について説明します。

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

この例のステージを設定するために、modelpowerの2つのプロパティを持つエンティティ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がテストセットアップ中に作成したCaridであると仮定します。 Caridプロパティは自動生成される可能性が高く、変更される可能性があるため、テストの再現性のために、ハードコードされた数値(たとえば、「2」)は使用しないでください。時間とともに。 presentsByIdクエリは、オブジェクトの存在をチェックする最も簡単ですが、柔軟性が最も低い方法です

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

Springの派生クエリメソッド機能を使用して、クエリを作成することもできます。 この例では、指定されたモデル名の Car が存在するかどうかを確認するため、次のクエリメソッドを考案します。

boolean existsCarByModel(String model);

メソッドの名前は任意ではないことに注意することが重要です—特定のルールに従う必要があります。 次に、Springは、メソッドの名前からSQLクエリを取得できるように、リポジトリのプロキシを生成します。 IntelliJ IDEAのような最新のIDEは、そのための構文補完を提供します。

クエリがより複雑になると(たとえば、順序付け、結果の制限、いくつかのクエリ基準を組み込むなど)、これらのメソッド名は、判読不能になるまで非常に長くなる可能性があります。 また、派生クエリメソッドは、暗黙的で「慣例による」性質のため、魔法のように見える場合があります。

それでも、クリーンで整理されたコードが重要な場合や、開発者が十分にテストされたフレームワークに依存したい場合に役立ちます。

5. で検索

Example は、 Example Matchers を使用してクエリを動的に構築するため、存在を確認する非常に強力な方法です。 したがって、動的性が必要な場合は常に、これが適切な方法です。 Spring ExampleMatcher の包括的な説明とその使用方法については、 Spring DataQueryの記事を参照してください。

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. 存在するセマンティクスを使用したカスタム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);

アイデアは、モデルプロパティに基づいて大文字と小文字を区別しないカウントクエリを実行し、戻り値を評価して、結果をJava booleanにマップすることです。繰り返しますが、ほとんどのIDEはかなり優れていますJPQLステートメントのサポート。

カスタムJPQLクエリは、派生メソッドの代替と見なすことができ、SQLのようなステートメントに慣れていて、追加の@Queryアノテーションを気にしない場合に適しています。 。

7. 結論

このチュートリアルでは、SpringDataとJPAを使用してオブジェクトがデータベースに存在するかどうかを確認する方法を説明しました。 手元のユースケースと個人的な好みに大きく依存するため、どの方法をいつ使用するかについての厳格なルールはありません。

ただし、経験則として、選択肢があれば、開発者は、堅牢性、パフォーマンス、およびコードの明確さの理由から、常により単純な方法に傾倒する必要があります。 また、派生クエリまたはカスタムJPQLクエリのいずれかを決定したら、一貫したコーディングスタイルを確保するために、可能な限りその選択を維持することをお勧めします。

完全なソースコードの例は、GitHubにあります。