次に、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();
参照コードは以下の通りです:
|