DetachedCriteriaとCriteriaの使い方を簡単に話します(必ず見ます)


従来のWebプログラミングでは、ユーザーがウェブページ上である条件を自由に選択して、SQL文を動的に生成し、問合せする大量の動的条件クエリがあります。
例えば、フェイスブックの中で高級な検索条件を選ぶことができると覚えています。これはダイナミックな検索です。何個のクエリを使うかは予知できません。直接書きました。私たちのDao層では明らかに不服という意味です。
このような要求に対しては、階層アプリケーションに対して、Web層はクエリーの条件リストをトラフィック層オブジェクトに渡す必要があり、トラフィック層オブジェクトはこの条件リストを取得した後、条件を順次取り出して、クエリ文を作成する。ここの難点の一つは条件リストは何で構成されていますか?伝統的にはMapを使用していますが、このような方法は欠陥が大きく、Mapで伝達できる情報は非常に限られています。nameとvalueしか伝達できません。一体どのような条件演算を行うべきかは伝達できません。したがって、暗黙的条件が変更されると、サービス層オブジェクトのクエリー構造アルゴリズムは、対応するように修正されなければならないが、このようなクエリー条件の変更は、プログラムコードの制約ではなく、暗黙的に約束されているので、エラーが発生しやすい。
DetachedCriteriaは、この問題を解決することができます。すなわち、web層では、プログラマはDetachedCriteriaを使用してクエリー条件を構築し、その後、このDetachedCriteriaを方法として呼び出しパラメータとしてトラフィック層オブジェクトに渡すことができます。ビジネス層オブジェクトがDetachedCriteriaを取得した後、session範囲内で直接Criteriaを構築して照会することができます。これにより、照会文の構造は完全にウェブ層から離れて実現され、業務層は永続化とクエリのパッケージのみを完成させることができ、照会条件の構造と完全に結合され、完璧です。
CriteriaとDetachedCriteriaの主な違い
作成の形態が違っています。Criteriaはオンラインですので、Hibernate Sessionによって作成されました。DetachedCriteriaはオフラインです。作成時にSessionは必要ありません。
DetachedCriteriaの作成
DetachedCriteriaは、DetachedCriteriaのインスタンスの作成を行う2つの静的方法を提供する。
forクラス
forEnttityName(Name)
Springのフレームワークはオフラインクエリのサポートを提供しています。非常に簡単にそれらの方法を使用します。
Springのフレームワークは、DetachedCriteria法を提供しており、DetachedCriteria法によって、クエリー結果を簡単に返すことができる。CriteriaのサブクラスがDetachedCriteriaです。簡単に使えばいいです。
これらを使ったら、私達はRetrictionsと言わざるを得ません。
は、クエリー条件を生成するツールクラスです。Retrictions表式は以下の通りです。
HQL演算子QBC演算子の意味
=Restictions.eq()はequalに等しい
<>Retrictions.ne()はnot equalに等しくない

 Restrictions.gt()   greater than 
= Restrictions.ge()      greater than or equal 
< Restrictions.lt()   less than 
<= Restrictions.le()         less than or equal 
is null Restrictions.isnull()      
is not null Restrictions.isNotNull()     
like Restrictions.like()         
and Restrictions.and()     
and Restrictions.conjunction()     
or Restrictions.or()     
or Restrictions.disjunction()     
not Restrictions.not()     
in(  ) Restrictions.in()            
not in(  ) Restrictions.not(Restrictions.in())             
between x and y Restrictions.between()     xy      
not between x and y Restrictions.not(Restrictions..between())    X      y
Criteriaこれも言わなければならないものです。翻訳すると条件、標準などの意味です。私たちのオフラインと同じです。
例を見てみましょう。
User表のすべての資料を調べます。
私達はこれが私達のsessionの対象を獲得しなければなりません。オンラインの調査は私達のQueryと似ていますが、もっと強いです。

 Criteria criteria = session.createCriteria(User.class);
 List users = criteria.list();
 Iterator iterator = users.iterator();
 while(iterator.hasNext()) {
  User user = (User) iterator.next();
  System.out.println(user.getId() + user.getName());   
 }
Criteriaはただのコンテナであり、クエリー条件を設定するには、add()方法を使用してRestritionsに加入する条件制限が必要であり、例えば、調査ageは20より大きく、40未満の資料である。私たちのSQL文も完成できますが、より良いパッケージのために、より多くの多重コードは、直接的に私たちのSQL文を書かないほうがいいです。会社のパッケージコードを見て、やっと先輩の強大さを感じました。コードを多重化する柔軟性はとても高いです。ここでは、無制限のRestritionsを伝えてパッケージ化できます。とても便利です。

Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.gt("age", new Integer(20)));
criteria.add(Restrictions.lt("age", new Integer(40)));
List users = criteria.list();
また、(eq)20または(or)ageが空(isNull)の条件に等しいように、論理的な組み合わせを使用して、斬撃された行クエリを組み合わせることもできます。
一つの個別の照会条件はorg.hibernation.riterion.riterionインターフェースの一例である。
org.hibernation.riterion.Restritions類は、いくつかのCriterionタイプを内蔵する工場方法を獲得すると定義しています。

List cats = sess.createCriteria(Cat.class)

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

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

 .list();
ダイナミック関連キャプチャ
私たちのスナップモードは、1対の複数の関連形式について!捕まえてきますか?
setFettMode()を使って、動作時に動的関連キャプチャの意味を定義できます。

List cats = sess.createCriteria(Cat.class)

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

.setFetchMode("mate", FetchMode.EAGER)

.setFetchMode("kittens", FetchMode.EAGER)

.list();
このクエリは外連結でmateとkittensをキャプチャすることができます。
DetachedCriteriaの関連クエリ
stuNameでStudentの記録を調べると、次のようになります。

DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
dc.add(Restrictions.like("stuName", stuName, MatchMode.ANYWHERE)); 
StudentのTeamのteamNameでStudentの記録を調べると、多くの人がこう書きます。

DetachedCriteria dc = DetachedCriteria.forClass(Student.class); 
dc.add(Restrictions.like("team.teamName", teamName, MatchMode.ANYWHERE)); 
残念なことに、上記のプログラムはStudentにteam.team Name属性が見つからないということは理解できます。では、どのようにteam Nameを通じて、Studentを検索しますか?
このように書いてもいいです

DetachedCriteria dc = DetachedCriteria.forClass(Student.class); 
dc.createAlias("team", "t"); 
dc.add(Restrictions.like("t.teamName", teamName, MatchMode.ANYWHERE)); 
そうです。まずチームの引用を作って、チームナメにナビゲートします。
DepartmentとEmployeeはペアで多く関連しています。名前は「department」開発部門で、部門内の従業員の年齢は20歳以上です。

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.add(Restrictions.eq("name", "department"))
     .createAlias("employees", "e")
     .add(Restrictions.gt(("e.age"), new Integer(20)));
List list = this.getHibernateTemplate().findByCriteria(detachedCriteria);
投影、集約、グループ化
org.hibernation.riterion.ProjectionはProjectionの実例工場です。
私たちはset Projection()アプリケーションを呼び出してクエリーに投影した。これはどの列の意味ですか?
集合作業を行います。sqlの重合と似ています。平均値を求める/統計記録を取る/など。
また、オブジェクトのいくつかの属性(フィールド)や属性セットを取得するために使用されます。通常は、オブジェクトまたはオブジェクトのセットを検索します。投影を使用すると、必要な属性値だけを返すことができます。つまり、Hbernateはパッケージオブジェクトを記録しません。あなたが映画に設定した属性の値(値のセット)の配列に戻ります。

List results = session.createCriteria(Cat.class)

 .setProjection( Projections.rowCount() )

 .add( Restrictions.eq("color", Color.BLACK) )

 .list();

List results = session.createCriteria(Cat.class)

 .setProjection( Projections.projectionList()

  .add( Projections.rowCount() )

  .add( Projections.avg("weight") )

  .add( Projections.max("weight") )

  .add( Projections.groupProperty("color") )

 )

 .list();
条件クエリーでは「group by」を明示的に使用する必要はない。いくつかの投影タイプは、パケット投影として定義され、彼らもSQLのgroup byサブルーチンに登場する。
投影値を制約または順序付けで参照できるように、別名を投影に割り当てるように選択できます。次は二つの違いです。
実装:

List results = session.createCriteria(Cat.class)

 .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )

 .addOrder( Order.asc("colr") )

 .list();

List results = session.createCriteria(Cat.class)

 .setProjection( Projections.groupProperty("color").as("colr") )

 .addOrder( Order.asc("colr") )

 .list();
alias()およびas()方法は、投影例を他の別名のProjectionの例に簡単にラッピングする。簡単に言えば、投影リストに投影すると別名を指定できます。

List results = session.createCriteria(Cat.class)

 .setProjection( Projections.projectionList()//            !         !

  .add( Projections.rowCount(), "catCountByColor" )

  .add( Projections.avg("weight"), "avgWeight" )

  .add( Projections.max("weight"), "maxWeight" )

  .add( Projections.groupProperty("color"), "color" )

 )

 .addOrder( Order.desc("catCountByColor") )

 .addOrder( Order.desc("avgWeight") )

 .list();
投影はProperty.forName()を使用してもよい。

List results = session.createCriteria(Cat.class)

 .setProjection( Projections.projectionList()

  .add( Projections.rowCount().as("catCountByColor") )

  .add( Property.forName("weight").avg().as("avgWeight") )

  .add( Property.forName("weight").max().as("maxWeight") )

  .add( Property.forName("color").group().as("color" )

 )

 .addOrder( Order.desc("catCountByColor") )

 .addOrder( Order.desc("avgWeight") )

 .list();

DetachecdCriteriaクラスは、一つのセッション範囲外でクエリーを作成し、任意のSessionを使用して実行することができます。
スプリングパッケージを使ってもいいですよ。

DetachedCriteria query = DetachedCriteria.forClass(Cat.class)

 .add( Property.forName("sex").eq('F') );

//    Session

Session session = .;

Transaction txn = session.beginTransaction();

List results = query.getExecutableCriteria(session).setMaxResults(100).list();

txn.commit();

session.close();

サブとしてもいいです。

DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)

 .setProjection( Property.forName("weight").avg() );

session.createCriteria(Cat.class)

 .add( Property.forName("weight).gt(avgWeight) )

 .list();
以上の簡単な話ですが、DetachedCriteriaとCriteriaの使い方は小編集で皆さんに共有した内容の全部です。参考にしていただければと思います。どうぞよろしくお願いします。