Spring Data(二)クエリー

6540 ワード

Spring Data(二)クエリー
次の記事では、Spring Dataクエリのポリシーについて説明します.
クエリの生成
クエリの構築メカニズムはSpring Dataの基礎に非常に役立ちます.構築されたメカニズムは,接頭辞find...By,read...By,query...By,count...By,get...Byなどを遮断し,残りの部分から解析を開始する.省略記号はdistinctなどのキーワードをさらに使用してクエリーを作成できます.最初のByは境界記号として,後の部分で解析を開始する.最も基本的には、エンティティの属性を使用して条件を定義し、AndまたはOrを使用して接続できます.
メソッド名生成クエリー:
interface PersonRepository extends Repository {
    List findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
 
    //   distinct       
    List findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
    List findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
 
    // Enabling ignoring case for an individual property
    List findByLastnameIgnoreCase(String lastname);
 
    // Enabling ignoring case for all suitable properties
    List findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
 
    //       OrderBy
    List findByLastnameOrderByFirstnameAsc(String lastname);
    List findByLastnameOrderByFirstnameDesc(String lastname);
}

解析方法の実際の結果は、永続化されたストレージに依存しますが、いくつかの一般的なものがあります.
  • 式は、通常、プロパティを巡回し、オペレータ接続を使用します.アトリビュートを接続するには、エクスプレッションAndまたはOrを使用するか、他のオペレータBetween、LessThan、GreaterThan、Likeなどを使用します.サポートされているオペレータは非常に広く、適切な関連ドキュメントをクエリーすることができます.
  • メソッド解析器は、単一のプロパティ設定IgnoreCaseの識別子(例えば、findByLastnameIgnoreCase(...)、または1つのタイプのすべてのプロパティ設定ignoring case(例えば、findByLastnameAndFirstnameAllIgnoreCase(...)をサポートします.ignoring casesが広範なデータベースでサポートされているかどうかにかかわらず、指定したデータベースの関連ドキュメントをクエリーします.
  • OrderByを使用してメソッドクエリーをソートできます.

  • 属性式
    プロパティ式は、管理されているエンティティのプロパティにのみ関連します.クエリーが生成されると、解析されたプロパティが管理するエンティティクラスのプロパティであると判断しました.また、ネストされたプロパティで制約を定義し、PersonクラスにAddressクラスがあり、AddressクラスにZipCodeクラスがあると仮定することもできます.メソッドの名前は次のとおりです.
    List findByAddressZipCode(ZipCode zipCode);
    

    生成されたプロパティは、x.address.zipCodeとネストされます.解决のロジックはAddressZipCodeから始まり、この名前(イニシャル小文字)で属性をチェックし、見つかったらこの属性をチェックします.見つからない場合は、右側からアルパカの規則に従って分割し、頭と尾に分割し、適切な属性を見つけようとします.私たちの例では、分割層AddressZipとCodeです.次に、ヘッダで適切なプロパティが見つかった場合、テールで次のレイヤを検索し続け、テールを上記の説明のように分割し続けます.最初の分割が一致しなかった場合は、分割点を左に移動して続行します.
    この論理はほとんどの場合に動作しますが、誤った属性を選択する可能性もあります.PersonにもaddressZipの属性があると仮定し、この論理は最初の分割に一致し、誤った属性を選択し、最終的に失敗する(addressZipにはcodeフィールドがない).
    曖昧な意味を解決するために、メソッド名に「」を使用して手動で分割点を作成できます.私たちの方法の名前は次のとおりです.
    List findByAddress_ZipCode(ZipCode zipCode);
    

    下線を保持フィールドとして使用し、java標準の命名規則を使用することを強くお勧めします.
    特殊パラメータの処理
    クエリーでパラメータを処理するには、上記の例のように、メソッドパラメータを簡単に定義できます.これらに加えて、PageableやSortなどの特殊なタイプを認識することができ、クエリーにページングやソートを適用することができます.例は次のとおりです.
    Page findByLastname(String lastname, Pageable pageable);
    Slice findByLastname(String lastname, Pageable pageable);
    List findByLastname(String lastname, Sort sort);
    List findByLastname(String lastname, Pageable pageable);
    

    最初のメソッドは、Pageableインスタンスを使用してクエリーにページングを追加し、Pageインタフェースは要素の総数と使用可能なページングを知っています.これは、データベースの使用に依存し、PageをSliceで置き換えることができます.Sliceは、次の利用可能なSliceがあるかどうかしか知らないので、大きな結果セットを巡るのに十分です.
    ソートオプションはPageableインスタンスで処理することもできます.ソートのみが必要な場合は、Sortパラメータをメソッドに簡単に追加し、簡単なリストを返すことができます.クエリーが何ページあるかを見つけるには、追加のcountクエリーをトリガーする必要があります.デフォルトでは、このクエリーはトリガーされたクエリーから派生します.
    クエリー結果の制限
    クエリー・メソッドの結果は、first、topなどのキーワードによって制限され、交換して使用することができます.後に続く数値は最大の結果セットを設定し、数値が設定されていない場合は結果を返します.
    検索結果のサイズをTopとFirstで制限する
    User findFirstByOrderByLastnameAsc();
    User findTopByOrderByAgeDesc();
    Page queryFirst10ByLastname(String lastname, Pageable pageable);
    Slice findTop3ByLastname(String lastname, Pageable pageable);
    List findFirst10ByLastname(String lastname, Sort sort);
    List findTop10ByLastname(String lastname, Pageable pageable);
    

    制限された式はDistinctキーワードもサポートされ、クエリの結果セットをインスタンスに設定し、結果をOptionalにカプセル化することもサポートされます.
    paginationまたはslicingが制限されたクエリー・ページングに適用される場合、制限された結果セットにも適用されます.
    クエリ結果フロー
    クエリの結果はjava 8のStreamで処理することもでき、streamの良好なパフォーマンスを使用することができます.
    @Query("select u from User u")
    Stream findAllByCustomQueryAndStream();
     
    Stream readAllByFirstnameNotNull();
     
    @Query("select u from User u")
    Stream streamAllPaged(Pageable pageable);
    

    streamは最下位のリソースを使用しているため、使用後に閉じる必要があります.closeを使用して手動で閉じることも、java 7のtry-with-resourcesブロックを使用することもできます.
    try (Stream stream = repository.findAllByCustomQueryAndStream()) {  
        stream.forEach(…);
    }
    

    すべてのSpring DataモジュールがStreamをサポートしているわけではありません.
    非同期クエリの結果
    倉庫のクエリー・メソッドは非同期で実行できます.これは、クエリーがSpring TaskExecutorにコミットされ、すぐに実行されないことを意味します.
    @Async
    Future findByFirstname(String firstname); 
     
    @Async
    CompletableFuture findOneByFirstname(String firstname); 
     
    @Async
    ListenableFuture findOneByLastname(String lastname);
    

    最初のメソッドは、Futureを戻り結果として使用します.
    2つ目の方法はjava 8のCompletableFutureを戻り結果として使用します.
    3つ目の方法はSpringのListenableFutureをリターン結果として用いた.
    倉庫インスタンスの生成
    各Spring Dataモジュールには、Springスキャンのパケットパスを指定するrepositories要素が含まれています.
    Spring Dataのxml構成方式
    
    
         
        
    
    

    上記の例では、Springはcom.acme.repositoriesとそのすべてのサブパッケージをスキャンし、Repositoryとそのサブクラスのすべてのポートを継承し、それらを倉庫に構築します.各インタフェースが発見されると、springは指定された永続化技術を登録し、適切なエージェント処理クエリー方法を生成する.各beanはインタフェースの名前で登録されているので、UserRepositoryインタフェースはuserRepositoryに登録されます.base-packageパラメータは正規表現を使用できます.
    JavaConfig注記を使用してパッケージのスキャンを構成することもできます
    @Configuration
    @EnableJpaRepositories("com.acme.repositories")
    class ApplicationConfiguration {
        @Bean
        EntityManagerFactory entityManagerFactory() { // … }
    }
    

    ここでは例としてJpaを用いた.
    Spring DataのCommonモジュールをご紹介しますので、コメントエリアでご交流ください