ホームページ  >  記事  >  Java  >  DetachedCriteriaとCriteriaの使用例をまとめます

DetachedCriteriaとCriteriaの使用例をまとめます

零下一度
零下一度オリジナル
2017-06-01 09:11:401960ブラウズ

以下のエディターでは、DetachedCriteria と Criteria の使用方法について簡単に説明します (必読)。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。エディターをフォローして見てみましょう

従来の Web プログラミングでは、動的条件付きクエリが多数あります。つまり、ユーザーが Web ページ上で特定の条件を自由に選択し、プログラムがそれに基づいてクエリ用の SQL ステートメントを動的に生成します。ユーザーの選択条件。

たとえば、Facebook では高度なクエリ条件を選択できることを覚えていますが、これは動的クエリであり、Dao レイヤーに直接記述することは明らかに意図と一致しません。

この要求に応えて、階層型アプリケーションの場合、Web 層はクエリ条件リストをビジネス層オブジェクトに渡す必要があります。ビジネス層オブジェクトが条件リストを取得した後、条件を順番に取り出してクエリを構築します。声明。ここでの 1 つの問題は、条件リストをどのように構築するかということです。 Map は伝統的に使用されてきましたが、この方法には大きな欠陥があります。Map が伝達できるのは名前と値だけであり、それがより大きいか、より小さいかなどを伝達することはできません。ビジネス層オブジェクトは、各エントリの暗黙的な条件を正確に把握する必要があります。したがって、暗黙的な条件が変更されると、それに応じてビジネス層オブジェクトのクエリ構築アルゴリズムを変更する必要があります。ただし、このクエリ条件の変更はプログラム コードによって制限されず、暗黙的に合意されるため、非常にエラーが発生しやすくなります。

DetachedCriteria はこの問題を解決できます。つまり、Web 層では、プログラマーは DetachedCriteria を使用してクエリ条件を構築し、この DetachedCriteria をメソッド呼び出しパラメーターとしてビジネス層オブジェクトに渡します。ビジネス層オブジェクトは DetachedCriteria を取得した後、クエリの session のスコープ内で Criteria を直接構築できます。この点で、クエリ ステートメントの構築は実装のために Web 層に完全に移動され、ビジネス層はクエリの永続化とカプセル化を完了することのみを担当します。クエリ条件の構築から完全に分離されています。これは完璧です。

Criteria と DetachedCriteria

の主な違いは、Criteria はオンラインであるため、Hibernate Session によって作成されるのに対し、DetachedCriteria はオフラインであり、作成時にセッションを必要としないことです。

DetachedCriteria の作成

DetachedCriteria には、DetachedCriteria インスタンスを作成するための 2 つの静的メソッドが用意されています。


forClass(Class) forEntityName(Name)

Spring のフレームワークはオフライン クエリのサポートを提供しており、これらのメソッドを使用するのは非常に簡単です

Spring のフレームワークは getHibernateTemplate( ).findByCriteria( DetachedCriteria) メソッドは、DetachedCriteria に基づいてクエリ結果を簡単に返すことができます。 Criteria のサブクラスは DetachedCriteria で、これを簡単に使用できます。


これらを使用した後、Restrictions

はクエリ条件を生成するためのツール クラスであると言わざるを得ません。 Restrictions の式は次のとおりです

HQL 演算子 QBC 演算子の意味
= Restrictions.eq() は等しい
a8093152e673feb7aba1828c43532094 Restrictions.ne() は等しくない

 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 テーブル内のすべての情報を確認してください


セッション オブジェクトを取得する必要があります~~オンライン クエリも同様です。 、しかしさらに強力です!

 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() メソッドを使用して、たとえば、年齢が 20 を超え 40 未満のデータをクエリします。 SQL ステートメントを完成させることもできますが、より適切にカプセル化してコードを再利用するには、SQL ステートメントを直接記述しないことが最善です。会社のカプセル化されたコードを見て初めて、当社の先行製品の比類のないパワー、つまりコードの柔軟性を実感できます。再利用性が非常に高いです! ここでは、無制限の制限を渡してカプセル化することができ、非常に便利です。

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 に等しい、または (または) 年齢が空である (isNull) という条件を組み合わせるなど、論理的な組み合わせを使用してクエリを実行することもできます。

別のクエリ条件は org.hibernate.criterion です。 .Criterion インターフェイスのインスタンス。

org.hibernate.criterion.Restrictions クラスは、いくつかの組み込み Criterion タイプを取得するためのファクトリ メソッドを定義します。

List cats = sess.createCriteria(Cat.class)

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

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

 .list();

動的関連付けクロール

私たちのクロール モードは 1 対多の関連付けの形式です。捕まったのか?

setFetchMode() を使用して、実行時に動的リレーショナルフェッチのセマンティクスを定義できます

List cats = sess.createCriteria(Cat.class)

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

.setFetchMode("mate", FetchMode.EAGER)

.setFetchMode("kittens", FetchMode.EAGER)

.list();

このクエリは、外部接続を通じてメイトと子猫をフェッチできます。

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.teamName属性,这是可以理解的。那么如何通过teamName查找、、Student呢?

可以这么写:

DetachedCriteria dc = DetachedCriteria.forClass(Student.class); 
dc.createAlias("team", "t"); 
dc.add(Restrictions.like("t.teamName", teamName, MatchMode.ANYWHERE));

没错,就是要先建立team的引用,才能用team导航到teamName

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);

投影(Projections)、聚合(aggregation)和分组(grouping)

org.hibernate.criterion.Projections是 Projection 的实例工厂。

我们通过调用setProjection()应用投影到一个查询。这个的意思就是查询哪一列的意思

用来进行聚合操作,和sql中的聚合类似.求和/求平均值/统计记录数/…等等.

还有用来获取获取对象的某些属性(表字段)或属性集合.正常情况下,查询返回的是对象或对象的集合.使用投影的话就可以只返回你需要的属性值.即Hibernate不把记录封装对象了,只返回你在投影中设置的属性的值(值的集合)的数组

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();

DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。
也可以使用spring封装好的哦!

DetachedCriteria query = DetachedCriteria.forClass(Cat.class)

 .add( Property.forName("sex").eq(&#39;F&#39;) );

//创建一个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();

【相关推荐】

1. 浅谈php函数serialize()与unserialize()的使用方法

2. PHP sprintf() 函数使用方法详解

3. php session()函数使用方法详解

以上がDetachedCriteriaとCriteriaの使用例をまとめますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。