この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 16672|答える: 0

[出典] createCriteriaの詳細な使い方はHibernateのQBCクエリです

[リンクをコピー]
掲載地 2017/08/09 14:26:13 | | |

次に、id、name、age属性を持つStudentクラスがあるとします
文字列 hql = 「学生sから」;
昔と同じように、いつもそうしています
Query query = session.createQuery(hql);
または条件に従って検索することもできます。
文字列 hql = 「Student s から、『King%』のような s.name」
Query query = session.createQuery(hql);
HQLの代わりにQBCを使う場合、コードは以下の通りです:
基準 基準 =session.createCriteria(Student.class);
基準 criterion = Expression.like("名前","king%");
こんなふうには見えない。 次に22歳という年齢に探索条件を加えます。
HQL:
文字列 hql = 「学生sから、『Wang%』とs.age=22のような s.name」;
Query query = session.createQuery(hql);
リストリスト = query.list();
QBC:
基準 基準 =session.createCriteria(Student.class);
基準 criterion1 = Expression.like("name","king%");
基準 criterion2 = Expression.eq("age",newInteger(22));
criteria.add(criterion1).add(criterion2);
リストリスト = criteria.list();


見た目はずっと扱いにくくなります。 しかし、プロジェクトを経験したことがある人なら誰でも、モジュールのビジネスロジックが変わるとSQLを書き直さなければならず、最も厄介なのは他人のHQLやSQLを奪うことです。
QBCを使うと、コードの可読性と保守性が大幅に向上します。
null 値は
例えば、ヌル名の学生オブジェクトを探したい場合、次のように書くべきです
基準 基準 =session.createCriteria(Student.class);
Criterion criterion = Expression.isNull("name");
criteria.add(criterion).list();
そして、その間を... そして時間
基準 基準 =session.createCriteria(Student.class);
基準 criterion1 = Expression.ge(「年齢」、新整数(20)); 下限値
基準 criterion2 = Expression.le("age", new Integer(25)); 天井
//这里也可以把上述两个条件添加到第三个条件里
基準 criterion3 =Expression.and(criterion1,criterion2);
criteria.add(criterion3).list();
20歳から25歳の学生に相当します
これは、s.age >=20、s.age <=25 の学生sから同値です。


以下はHQLとQBCの一般的に使われるクエリ条件の比較です
HQL QBC の意味
> 以上 = Expression.ge()
Greater than > Expression.gt()
< 以下 = Expression.le()
< Expression.lt 未満()
equals = Expression.eq()
は <>or!= Expression.ne() に等しくありません。

Nullはnullです。Expression.isNull()
is notnull Expression.isNotNull()
指定された範囲内で、weenとExpression.between()
指定された範囲内ではありません、Expression.not(Expression.between())
Expression.in()のコレクションに属しています
Expression.not(Expression.in())のコレクションの一部ではありません。
そしてexpression.and()
またはExpression.or()
Not Expression.not()
Expression.likeのような曖昧なクエリ



1. net.sf.hibernate.Criteria の基準インスタンスを作成する このインターフェースは特定の永続性クラスに対するクエリを表します。 セッションはCriteriaインスタンスを製造するための工場です。



Criteria crit = sess.createCriteria(Cat.class);


crit.setMaxResults(50);


リスト猫 = crit.list();


2. 結果セットの範囲を絞る クエリ条件(Criterion)はnet.sf.hibernate.expression.Criterionインターフェースのインスタンスです。 net.sf.hibernate.expression.Expression クラスは、組み込みの Criterion 型を定義します。


List cats = sess.createCriteria(Cat.class)


                .add( Expression.like("name", "Fritz%")


                .add( Expression.between("weight", minWeight, maxWeight))


                .list();
式は論理的にグループ化できます。

List cats = sess.createCriteria(Cat.class)



                .add( Expression.like("name", "Fritz%")


                .add( Expression.or( Expression.eq( "age", new Integer(0) ), Expression.isNull("age")))


                .list();


List cats = sess.createCriteria(Cat.class)


                .add( Expression.in( "name", new String[]{"Fritz", "Izi", "Pk"})


                .add( Expression.disjunction()


                .add( Expression.isNull("age") )


                .add( Expression.eq("age", new Integer(0) ) )


                .add( Expression.eq("age", new Integer(1) ) )


                .add( Expression.eq("age", new Integer(2) ) ) )


                 .list();
多くの既成条件タイプ(表現のサブクラス)があります。 SQLを直接埋め込むことができる便利なものがあります。

List cats = sess.createCriteria(Cat.class)



                .add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))


                .list();  
ここで{alias}はプレースホルダーで、クエリ対象エンティティの行エイリアスに置き換えられます。 (元の意味:{alias}のプレースホルダーは、クエリ対象エンティティの行別名に置き換える。)


3. 結果のソート net.sf.hibernate.expression.Order を使って結果セットをソートできます。


List cats = sess.createCriteria(Cat.class)



                .add( Expression.like("name", "F%")


                .addOrder( Order.asc("name"))


                .addOrder( Order.desc("age"))


                .setMaxResults(50)


                .list();


4. アソシエーション アソシエーション間でcreateCriteria()を用いて、関係を持つエンティティ間の制約を簡単に指定できます。

List cats = sess.createCriteria(Cat.class)



                 .add( Expression.like("name", "F%")


                 .createCriteria("kittens")


                 .add( Expression.like("name","F%")


                 .list();


2つ目のcreateCriteria()は新しいCriteriaのインスタンスを返し、kittensコレクションクラスの要素を指しています。 以下の代替形態は特定の状況で有用です。


List cats = sess.createCriteria(Cat.class)


                .createAlias("kittens", "kt")


                .createAlias("mate", "mt")


                .add(Expression.eqProperty("kt.name", "mt.name"))


                .list();


(createAlias())はCriteriaの新しいインスタンスを作成することはありません。 前述の2回のクエリでCatインスタンスが保持しているkittens collectionクラスは、条件で事前フィルタリングされていないことに注意してください! 条件を満たす子猫だけを返品したい場合は、returnMaps()を使わなければなりません。


List cats = sess.createCriteria(Cat.class)


.createCriteria("kittens", "kt")


.add( Expression.eq("名前"、"F%")


.returnMaps()


.list();


イテレーター iter = cats.iterator();


while ( iter.hasNext())


{  


地図 map = (地図) iter.next();


Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);


Cat kitten = (Cat) map.get("kt");


}


5. 動的アタッチメント 実行時にFetchMode()を設定することで、アソシエーションオブジェクトの自動フェッチポリシーを変更できます。



List cats = sess.createCriteria(Cat.class)


                .add( Expression.like("name", "Fritz%")


                .setFetchMode("mate", FetchMode.EAGER)


                .list();


このクエリは、外側の結合を通じて配偶者と子猫の両方を取得できます。


6. Example queries net.sf.hibernate.expression.Example クラスによると、指定されたインスタンスからクエリ条件を作成できます。


Cat cat = 新しいCat();


cat.setSex('F');


cat.setColor(Color.BLACK);


リスト結果 = session.createCriteria(Cat.class)


                    .add( Example.create(cat) )


                    .list();
バージョンプロパティ、表現プロパティ、アソシエーションはすべて無視されます。 デフォルトでは、null属性も除外されます。 例の適用方法を調整できます。 できます
例の適用方法を調整するために。 例:例:Example.create(cat) .excludeZeroes() //zero value プロパティを除外する


.excludeProperty("color") //「color」というプロパティを除外します。ignoreCase() //大文字に区別されない文字列比較を実行します


.enableLike(); 文字列比較にLikeを使う


リスト結果 = session.createCriteria(Cat.class)


                      .add(例)


                      .list();
関連するオブジェクトの基準を設定するために例を使うこともできます。 List results = session.createCriteria(Cat.class) .add(Example.create(cat) )


.createCriteria("mate") .add(Example.create(cat.getMate()) .list();


参照コードは以下の通りです:






先の:LINQの左、右、内側の接続
次に:jsにおけるletとvar定義変数の違い
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com