主要構造:
与えられた条件が固定されていないとき時々、私たちは、あなたが動的に適切なクエリを構築する必要があり、エンティティを照会、あなたは春データ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()); //合計数を取得 }
注:構造体を参照することができ、そしていくつかは、内部の前で見ることができ、省略されています。