春データJPAの動的なクエリの仕様

主要構造:

 

 

与えられた条件が固定されていないとき時々、私たちは、あなたが動的に適切なクエリを構築する必要があり、エンティティを照会、あなたは春データJPAでJpaSpecificationExecutorして、インターフェイスを照会することができます。JPQLを比較すると、その利点は、型の安全性で、より多くのオブジェクト指向します。

java.util.Listのインポート、

インポートorg.springframework.data.domain.Page; 
インポートorg.springframework.data.domain.Pageable; 
インポートorg.springframework.data.domain.Sort; 
インポートorg.springframework.data.jpa.domain .Specification; 

/ ** 
 *定義JpaSpecificationExecutor方法
 ** / 
 パブリックインターフェイスJpaSpecificationExecutor <T> { 
   	//クエリ条件ターゲットに係る
 	T findOne(仕様<T>仕様);	 
   	//条件クエリに応じて設定
 	リスト<T>のfindAll (仕様<T>スペック); 
   	//ページングクエリ条件
 	ページ<T>のfindAll(仕様<T>スペック、ページング可能ページング可能); 
   	//ソートクエリのクエリ
 	リスト<T>のfindAll(仕様< T>スペック、ソートソート) ; 
   	//統計問い合わせ 
 	長い数(仕様<T>仕様 )。
}

         JpaSpecificationExecutorのために、このインタフェースは、基本的仕様インターフェース定義の周りにあります。我々は、単に仕様クエリが構築され、として理解することができます。

次のように唯一のインターフェース仕様は、メソッドを定義します。

//クエリの構築
    / ** 
    *ルート:ルートインタフェースオブジェクトは、ルート属性エンティティにより得ることができる、クエリのルートを表す
    クエリ*:クエリーの定義からトップレベルのクエリオブジェクトを表し
    、この、クエリを構築するために使用:CB *多くの条件があり、主題の方法
    ** / 
    公共述語toPredicate(ルート<T>根、CriteriaQueryクエリ、CriteriaBuilder CB <?>);

  春の設定

<?xmlのバージョン= "1.0"エンコード= "UTF-8"> 
<豆のxmlns = "http://www.springframework.org/schema/beans" 
       のxmlns:XSI = "http://www.w3.org / 2001 / XMLスキーマ・インスタンス" 
       のxmlns:AOP = "http://www.springframework.org/schema/aop" 
       のxmlns:コンテキスト= "http://www.springframework.org/schema/context" 
       のxmlns:JDBC =" http://www.springframework.org/schema/jdbc " 
       のxmlns:TX = "http://www.springframework.org/schema/tx" 
       のxmlns:JPA =" http://www.springframework.org/schema/データ/ JPA " 
       のxmlns:タスク= "http://www.springframework.org/schema/task" 
       のxsi:schemaLocationの=" 
		http://www.springframework.org/schema/beansのhttp:// WWW。springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
		http://www.springframework.org/schema/context HTTP:// WWW .springframework.org /スキーマ/コンテキスト/春context.xsd 
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd 
		HTTP:// www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
		http://www.springframework.org/schema/data/jpa 
		HTTP://www.springframework .ORG /スキーマ/データ/ JPA /春-jpa.xsd「> 

    <! -春と春データJPAの設定- > 

    <! - 1.春のコンテナのEntityManagerFactory管理にオブジェクトを作成します- > 
    <豆ID = "entityManagerFactoty"クラス=「org.springframework.orm.jpa 。LocalContainerEntityManagerFactoryBean ">
        <プロパティ名= "データソース" REF = "データソース" /> 
        <! -スキャンパッケージ構成(エンティティクラスパッケージ) - > 
        <プロパティ名= "packagesToScan"値= "cn.itcast.domain" / > 
        <! - JPA実装メーカー- > 
        <プロパティ名= "はPersistenceProvider"> 
            <beanクラス= "org.hibernate.jpa.HibernatePersistenceProvider" /> 
        </プロパティ> 

        <! - JPAアダプタサプライヤー- > 
        <プロパティ名= "jpaVendorAdapter"> 
            <beanクラス= "org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
                <! -自動的にデータベース表を作成するかどうかを設定- > 
                <プロパティ名= "generateDdl"= "falseに"値/> 
                <! -指定したデータベースの種類- > 
                <プロパティ名= "データベース"値= "MYSQLベース" />
                < -データベース方言:!支持体のユニークな文法- > 
                <プロパティ名= "のDatabasePlatform"値= "org.hibernate.dialect.MySQLDialect" /> 
                <! -かどうかはSQL - > 
                <プロパティ名=「SHOWSQL真の"値=" "/> 
            </豆> 
        </プロパティ> 

        < - JPA方言:!高度な機能- > 
        <プロパティ名=" JpaDialect "> 
            の<beanクラス=" org.springframework.orm.jpa .vendor.HibernateJpaDialect "/> 
        </プロパティ> 

    </ビーン> 

    < - !2は、データベース接続のプールを作成- > 
    <前記ID上記豆="データソース"クラス=" com.mchange.v2.c3p0.ComboPooledDataSource「>
        <プロパティ名= "ユーザー"値= "ルート"> </ property>の
        <プロパティ名= "パスワード"値= "ルート"> </ property>の
        <プロパティ名= "jdbcUrlと"値= "JDBC:MySQLの:/// JPA"> </ property>の
        <プロパティ名= "driverClass"値= "はcom.mysql.jdbc.Driver"> </ property>の
    </ビーン> 

    !< - 3整合春dataJpa - > 
    <JPA:リポジトリのベースパッケージ= "cn.itcast.dao"トランザクション・マネージャ-REF = "のTransactionManager" 
                      エンティティマネージャの工場-REF = "entityManagerFactoty"> < / JPA:リポジトリ> 

    <! - 4配置事务管理器- >。
    <豆ID = "のTransactionManager"クラス= "org.springframework.orm.jpa.JpaTransactionManager"> 
        <プロパティ名= "のEntityManagerFactory" REF = "entityManagerFactoty 「> </ property>の
    </豆> 

    < - 4.txAdvice! - > 
    <TX:アドバイスID = "txAdvice"トランザクション・マネージャー= "のTransactionManager">
        <TX:属性> 
            <TX:メソッド名= "*保存"伝播= "REQUIRED" /> 
            <TX:メソッド名= "挿入*"伝播= "REQUIRED" /> 
            <TX:メソッド名= "アップデート*"伝播= "REQUIRED" /> 
            <TX:メソッド名= "削除*"伝播= "REQUIRED" /> 
            <TX:= "*を取得"読み取り専用= "真" />メソッド名
            メソッド名= "検索:<TX *」読み取り専用= "真" /> 
            <TX:メソッド名= "*"伝播= "REQUIRED" /> 
        </ TX:属性> 
    </ TX:アドバイス> 

    <! - 5.aop - > 
    < AOP:設定>
        <AOP:ポイントカットのid = "ポイントカット"表現= "実行(* cn.itcast.service * *(..)。。)" /> 
        <AOP:顧問の助言-REF = "txAdvice"ポイントカット-REF = "ポイントカット" />
    </ AOP:config>の


    <! - 5宣言的トランザクション- > 

    < - 6.スキャンバンドルの設定- !> 
    <コンテキスト:コンポーネントベース・パッケージスキャン= "cn.itcast"> </コンテキスト:スキャンコンポーネント> 
</豆>

  

個々のケースクエリ:

/ ** 
     *単一のクエリオブジェクト、条件に応じて
     * / 
    @Test 
    公共ボイドtestSpec(){ 
        / * 
         *クエリをカスタマイズする
         (一般に提供する:クエリオブジェクトタイプ)を実装* 1インタフェース仕様
         * 2の方法は、toPredicateを実現しました(構造クエリ)
         * 3のパラメータの方法は、2つのパラメータによって必要
         取得オブジェクト属性必要性:*ルート
         * CriteriaQuery:パッケージ内に、検索条件を構成するクエリ(ファジーマッチング、マッチング精度)の多く
         * 
         *ケース:顧客名、Jiege名前付きクエリ、顧客のクライアントに応じて
         *問い合わせ
         * 1.クエリ
         * CBオブジェクト
         * 2名のプロパティを比較する
         *ルートオブジェクトを
         * /
        仕様<顧客> =新しい新しい仕様書<顧客>(){ 
            公共toPredicate述語(ルート<顧客>根、A CriteriaQuery <?>クエリ、CriteriaBuilder CB){ 
                //。1.比較属性取得
                <オブジェクト>パス= root.getパス(「CUSTNAME」)
                // 2の構成は、cust_customerwhere CUST_NAME =「Jiege」SELECT * FROM問合せ
                / ** 
                 必要な特性の比較(パスオブジェクト):*最初のパラメータ
                 *二番目のパラメータ:電流を比較します値
                 * / 
                述語predicateA = cb.equal(パス、 "Jiege"); //正確なマッチング(特性の比較:プロパティ値の比較)のため

                predicateAを返します; 
            } 
        }。
        お客様の顧客= customerDao.findOne(仕様)。
        System.out.println(顧客)。
    }

 ケースページングクエリ:

/ ** 
     *クエリ]タブ
     *仕様:クエリ
     *ページング可能:ページングパラメータ
     *ページング・パラメータ:ページ、ページあたりのクエリの数
     *のfindAll(仕様、ページング可能);条件付きでページングクエリ
     *のfindAll(ページング可能)いいえ条件タブ
     *・バック・ページ(springDataJpa pageBean当社のパッケージオブジェクトデータリスト、合計数)
     * / 
    @Test 
    ます。public void testSpec4(){ 
        仕様仕様= NULL; 
        // PageRequest:オブジェクトは、インターフェイスクラスページング可能の実装です
        / ** 
         作成の過程で* PageRequest、彼は二つの引数を持つコンストラクタを呼び出す必要があります
         *最初のパラメータ:現在のクエリのページ数(0から始まる)
         *第二引数:ページあたりのクエリの数
         * / 
        ページング可能=新しい新しいPageRequestページング可能(0,2); 
        //ページングクエリ
        ページ<顧客>すべて= customerDao.findAll(ヌル、ページング可能); 
        System.out.printlnは(all.getContent()); //データセットリストを取得
        するSystem.out.printlnを(all.getTotalElements()); // GET総数
        のSystem.out.println(all.getTotalPages()); //合計数を取得


    }

 

   注:構造体を参照することができ、そしていくつかは、内部の前で見ることができ、省略されています。

 

おすすめ

転載: www.cnblogs.com/easyjie/p/12008161.html