Heim  >  Artikel  >  Java  >  Fassen Sie die Anwendungsbeispiele von DetachedCriteria und Criteria zusammen

Fassen Sie die Anwendungsbeispiele von DetachedCriteria und Criteria zusammen

零下一度
零下一度Original
2017-06-01 09:11:401910Durchsuche

Der folgende Editor bietet Ihnen eine kurze Diskussion über die Verwendung von DetachedCriteria und Criteria (unbedingt lesen). Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Editor und werfen wir einen Blick darauf

In der herkömmlichen Webprogrammierung gibt es eine große Anzahl dynamischer bedingter Abfragen, dh der Benutzer wählt bestimmte Bedingungen auf der Webseite frei aus und das Programm generiert dynamisch SQL-Anweisungen Erstellen Sie basierend auf den Auswahlbedingungen des Benutzers eine Abfrage.

Ich erinnere mich, dass Sie in Facebook erweiterte Abfragebedingungen auswählen können. Wir können nicht vorhersagen, wie viele Abfragen direkt verwendet werden bei uns. Bedeutung

Angesichts dieser Anforderung muss die Webschicht eine Abfragebedingungsliste an das Business-Layer-Objekt übergeben, nachdem sie diese Bedingungsliste erhalten hat Erstellen Sie die Abfrageanweisung, indem Sie die Bedingungen der Reihe nach erstellen. Eine Schwierigkeit hierbei ist, wie man die Bedingungsliste erstellt. Map wird traditionell verwendet, aber diese Methode weist große Mängel auf. Die Informationen, die Map übermitteln kann, sind nur sehr begrenzt. Sie können nicht vermitteln, welche Art von bedingter Operation ausgeführt werden soll als, wie, oder etwas anderes, muss das Business-Layer-Objekt die impliziten Bedingungen jedes Eintrags genau erfassen. Sobald sich die impliziten Bedingungen ändern, muss daher der Abfragekonstruktionsalgorithmus des Business-Layer-Objekts entsprechend geändert werden. Diese Änderung der Abfragebedingungen ist jedoch implizit vereinbart und nicht durch den Programmcode eingeschränkt, sodass sie sehr fehleranfällig ist.

DetachedCriteria kann dieses Problem lösen, das heißt, in der Webschicht verwenden Programmierer DetachedCriteria, um Abfragebedingungen zu erstellen, und übergeben diese DetachedCriteria dann als Methodenaufrufparameter an das Business-Layer-Objekt. Nachdem das Business-Layer-Objekt die DetachedCriteria erhalten hat, kann es die Kriterien direkt im Rahmen der Sitzung für die Abfrage erstellen. In dieser Hinsicht wurde die Erstellung von Abfrageanweisungen zur Implementierung vollständig auf die Webschicht verlagert, während die Geschäftsschicht nur für die Vervollständigung der Persistenz und Abfragekapselung verantwortlich ist. Sie ist vollständig von der Erstellung von Abfragebedingungen entkoppelt, was perfekt ist!

Der Hauptunterschied zwischen Criteria und DetachedCriteria

besteht darin, dass das Erstellungsformular online ist und daher erstellt wird Die Hibernate-Sitzung wird erstellt, während DetachedCriteria offline ist und beim Erstellen keine Sitzung benötigt. Bietet zwei statische Methoden zum Erstellen von DetachedCriteria-Instanzen.

for

Class(Class) forEntityName(Name)


Das Spring-Framework bietet Offline-Abfrageunterstützung, sehr Einfach zu verwendende Methoden
Das Spring-Framework stellt die Methode getHibernateTemplate().findByCriteria(tachedCriteria) bereit, um Abfrageergebnisse basierend auf DetachedCriteria einfach zurückzugeben. Die Unterklasse von Criteria ist DetachedCriteria, die wir einfach verwenden können.

Nachdem wir diese verwendet haben, müssen wir sagen, dass Restrictions

eine Toolklasse zum Generieren von Abfragebedingungen ist. Der Ausdruck von Einschränkungen lautet wie folgt:
HQL-Operator QBC-Operatorbedeutung

= Restrictions.eq() gleich gleich

a8093152e673feb7aba1828c43532094 ungleich ungleich Kriterien heißt übersetzt: Bedingungen, Standards und dergleichen! Es ist fast das Gleiche wie unser Offline-Modell

Schauen wir uns also ein Beispiel an



Überprüfen Sie alle Informationen in der Benutzertabelle

 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
Unsere Wir müssen unser Sitzungsobjekt abrufen~~ Die Online-Abfrage ähnelt unserer Abfrage, ist jedoch leistungsfähiger!


Kriterien sind nur ein Container. Wenn Sie Abfragebedingungen festlegen möchten, verwenden Sie einfach die Methode add(), um Einschränkungsbedingungen hinzuzufügen, z. B. Abfragedaten mit einem Alter von mehr als 20 und weniger als 40 Jahren. Obwohl unsere SQL-Anweisungen auch vervollständigt werden können, ist es für eine bessere Kapselung und mehr Code-Wiederverwendung am besten, unsere SQL-Anweisungen nicht direkt zu schreiben. Erst nachdem ich den gekapselten Code des Unternehmens gesehen habe, kann ich die unvergleichliche Leistungsfähigkeit unseres Vorgängers spüren Wiederverwendung ist sehr hoch! Hier können wir unbegrenzte Einschränkungen verabschieden, um sie zu kapseln, was sehr praktisch ist!


Sie können auch logische Kombinationen zum Abfragen verwenden, z. B. die Kombination von Alter gleich (eq) 20 oder (oder) Alter ist null (isNull):


Eine einzelne Abfrage Ein Kriterium ist eine Instanz der Schnittstelle org.hibernate.criterion.Criterion.

Die Klasse org.hibernate.criterion.Restrictions definiert Factory-Methoden zum Abrufen einiger integrierter Criterion-Typen.

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

Dynamisches Assoziations-Crawling
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();


Unser Crawling-Modus hat die Form einer 1-zu-viele-Assoziation! Wurde es gefangen?

List cats = sess.createCriteria(Cat.class)

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

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

 .list();
Sie können setFetchMode() verwenden, um die Semantik des dynamischen relationalen Abrufens zur Laufzeit zu definieren

Diese Abfrage kann Partner und Kätzchen über äußere Verbindungen abrufen.

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()函数使用方法详解

Das obige ist der detaillierte Inhalt vonFassen Sie die Anwendungsbeispiele von DetachedCriteria und Criteria zusammen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn