問合せ

問合せは、PagingAndSortingRepositoryインタフェースなどのリポジトリのベース・クラスで提供されるものを使用することも、独自に問合せを作成することもできます。Spring Data Frameworkでは、次のタイプの問合せがサポートされます。

  1. PagingAndSortingRepositoryインタフェースで提供される問合せ
  2. 導出問合せ
  3. ネイティブ問合せ

PagingAndSortingRepositoryインタフェース

NosqlRepositoryインタフェースでは、PagingAndSortingRepositoryインタフェースを拡張します。PagingAndSortingRepositoryインタフェースでは、CrudRepositoryインタフェースを拡張して、countdeletedeleteAlldeleteByIdexistsByIdfindAllfindAllByIdfindByIdsavesaveAllなどのメソッドを提供します。これらのメソッドは、どれも必要な機能に使用できます。SpringのPagingAndSortingRepositoryインタフェースの詳細は、PagingAndSortingRepositoryを参照してください。

導出問合せ

SpringのPagingAndSortingRepositoryインタフェースで提供される問合せメソッドとは別に、導出問合せを定義することもできます。Spring Data Frameworkには、組込みの問合せ作成機能があります。Spring Data Frameworkでは、問合せがJavaメソッド名のみから直接作成されます。

たとえば、次のような構造のJavaメソッド名があるとします。

List<Customer> findByFirstName(String firstName);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

declare $firstName String;

SELECT * FROM Customer AS c WHERE c.kv_json_.firstName = $firstName;

この導出問合せが機能するための唯一の要件は、このJavaメソッドをNosqlRepositoryインタフェースを拡張するインタフェースで定義する必要があることです。NosqlRepositoryインタフェースでは、導出問合せを担当するRepositoryインタフェースを拡張します。Javaメソッド名から共通の接頭辞が削除され、残りのJavaメソッド名から問合せの制約が解析されます。Springの導出問合せ作成の詳細は、「Query Creation」を参照してください。

Javaメソッドのうち接頭辞がfind…Byread…Byquery…Bycount…Byget…Byexists…Bydelete…Byおよびremove…Byのメソッドは、Spring Data Frameworkによって導出問合せのメソッドとみなされます。これらの接頭辞とは別に、その他のキーワードをJavaメソッド名に含めることもできます。次の項では、特定のキーワードを使用した場合に生成される詳細な導出問合せのスニペットについて説明します。

And

次の構造では、メソッド名にandという語が含まれています。

Iterable<Student> findByFirstNameAndLastName(String firstname, String lastname);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

declare $p_firstName String;
$p_lastName String;
 
SELECT * FROM Student AS s WHERE (
    s.kv_json_.firstName = $p_firstName AND s.kv_json_.lastName = $p_lastName)

ノート:

Oracle NoSQL Database SDK for Spring Dataでは、論理演算子(andor)の組合せを使用する導出問合せがサポートされています。生成された問合せは、Oracle NoSQL Database SQL問合せ言語で定義された演算子の優先順位のルールに従います。Oracle NoSQL Database SQL問合せ言語の演算子の優先順位の詳細は、『SQLリファレンス・ガイド』演算子の優先順位に関する項を参照してください。

Or

次の構造では、メソッド名にorという語が含まれています。

Iterable<Student> findByFirstNameOrLastName(String firstname, String lastname);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

declare $p_firstName String;
$p_lastName String;
 
SELECT * FROM Student AS s WHERE (
    s.kv_json_.firstName = $p_firstName OR s.kv_json_.lastName = $p_lastName)

ノート:

Oracle NoSQL Database SDK for Spring Dataでは、論理演算子(andor)の組合せを使用する導出問合せがサポートされています。生成された問合せは、Oracle NoSQL Database SQL問合せ言語で定義された演算子の優先順位のルールに従います。Oracle NoSQL Database SQL問合せ言語の演算子の優先順位の詳細は、『SQLリファレンス・ガイド』演算子の優先順位に関する項を参照してください。

OrderBy (Asc/Desc)

次の構造では、メソッド名にorderbyという語が含まれています。

Iterable<Student> findByLastNameOrderByFirstNameAsc(String lastname);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

declare $p_lastName String;
 
SELECT * FROM Student AS s 
    WHERE s.kv_json_.lastName = $p_lastName ORDER BY s.kv_json_.firstName ASC

次の構造では、メソッド名にorderbyという語が含まれています。

Iterable<Student> findByLastNameOrderByFirstNameDesc(String lastname);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

declare $p_lastName String;
 
SELECT * FROM Student AS s 
    WHERE s.kv_json_.lastName = $p_lastName ORDER BY s.kv_json_.firstName DESC

First

次の構造では、メソッド名にfirstという語が含まれています。

Page<Student> queryFirst5ByLastname(String lastname, Pageable pageable);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

Pageの詳細は、Pageを参照してください。Pageableの詳細は、Pageableを参照してください。

declare $p_lastName String;
$kv_limit_ Long;
$kv_offset_ Long;
 
SELECT * FROM Student AS s 
    WHERE s.kv_json_.lastName = $p_lastName LIMIT $kv_limit_ OFFSET $kv_offset_

Top

次の構造では、メソッド名にtopという語が含まれています。

Slice<Student> findTop10ByLastName(String lastname, Pageable pageable);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

Sliceの詳細は、Sliceを参照してください。

declare $p_lastName String;
$kv_limit_ Long;
$kv_offset_ Long;
 
SELECT * FROM Student AS s 
    WHERE s.kv_json_.lastName = $p_lastName LIMIT $kv_limit_ OFFSET $kv_offset_

Oracle NoSQL Database SDK for Spring Dataの問合せメソッドでサポートされているキーワードの完全なリストについては、「問合せメソッドでサポートされているキーワード」を参照してください。

次に、Oracle NoSQL Databaseリポジトリの例を示します。これは、NosqlRepositoryインタフェースを拡張する必要があります。バインドされた型は、IDフィールドのエンティティ・タイプとデータ型を表しています。

interface PersonRepository extends NosqlRepository<Person, Long> {
    List<Person> findByFirstNameAndLastName(String firstname, String lastname);
    List<Person> findByLastNameOrderByFirstNameDesc(String lastname);
}

ネイティブ問合せ

@oracle.spring.data.nosql.repository.Query注釈を使用すると、ネイティブSQL問合せを実行できます。

public interface AuthorRepository extends NoSQLRepository<Author, Long> {
    @Query(value = "DECLARE $firstName STRING; 
        SELECT * FROM author WHERE first_name = $firstName")
    List<Author> findAuthorsByFirstName(@Param("firstName") String firstName);

    @Query("DECLARE $firstName STRING; $last STRING; " +
        "SELECT * FROM Customer AS c " +
        "WHERE c.kv_json_.firstName = $firstName AND " +
        "c.kv_json_.lastName = $last")
    List<Customer> findCustomersWithLastAndFirstNosqlValues(
        @Param("$last") StringValue paramLast,
        @Param("$firstName") StringValue firstName
    );
}

パラメータは、@org.springframework.data.repository.query.Param注釈を使用することで名前と一致します。@Param注釈値フィールドは、宣言されたバインド変数の名前である'$'文字を含めて、正確に一致する必要があります。@Param注釈を使用していないと、例外がスローされます。すべてのパラメータは、「永続性モデル」の項で説明しているマッピング・ルールに従ってマップされます。

ノート:

2番目のメソッドfindAuthorsWithLastAndFirstNosqlValuesは、oracle.nosql.driver.values.StringValueと連動します。問合せパラメータでは、すべてのFieldValueサブクラスがサポートされます。FieldValueは、NoSQL SDK for Javaのすべてのデータ項目のベース・クラスです。各データ項目は、FieldValueのインスタンスであり、その型と値にアクセスできます。また、FieldValueを操作する追加のユーティリティ・メソッドにもアクセスをできます。それに加えて、FieldValue型のパラメータもサポートされます。FieldValueの詳細は、FieldValueを参照してください。