>  기사  >  Java  >  DetachedCriteria 및 Criteria의 사용 예를 요약합니다.

DetachedCriteria 및 Criteria의 사용 예를 요약합니다.

零下一度
零下一度원래의
2017-06-01 09:11:401912검색

아래 편집자는 DetachedCriteria 및 Criteria 사용 방법에 대한 간략한 설명을 제공합니다(반드시 읽어야 함). 에디터가 꽤 좋다고 생각해서 지금 공유해서 참고용으로 올려보겠습니다. 편집기를 따라 살펴보겠습니다

기존 웹 프로그래밍에는 동적 조건부 쿼리가 많이 있습니다. 즉, 사용자가 웹 페이지에서 특정 조건을 자유롭게 선택하고 프로그램이 이를 기반으로 쿼리에 대한 SQL 문을 동적으로 생성합니다. 사용자의 선택 조건.

예를 들어 Facebook에서는 고급 쿼리 조건을 선택할 수 있다는 것을 기억합니다. 이것은 동적 쿼리이므로 Dao 레이어에 직접 작성하는 것은 우리 의도와 일치하지 않습니다.

이 요구에 응답하여 계층화된 애플리케이션의 경우 웹 계층은 쿼리 조건 목록을 비즈니스 계층 개체에 전달해야 합니다. 비즈니스 계층 개체는 조건 목록을 얻은 후 순서대로 조건을 꺼내 쿼리를 구성합니다. 성명. 여기서 어려운 점 중 하나는 조건 목록을 구성하는 방법입니다. Map은 전통적으로 사용되지만 이 방법은 큰 결함이 있습니다. Map이 전달할 수 있는 정보는 매우 제한적이며, 이름과 값만 전달할 수 있습니다. 비즈니스 계층 개체는 각 항목의 암시적 조건을 정확하게 파악해야 합니다. 따라서 암시적 조건이 변경되면 그에 따라 비즈니스 계층 개체의 쿼리 구성 알고리즘을 수정해야 합니다. 그러나 이러한 쿼리 조건의 변경은 프로그램 코드에 의해 제한되지 않고 암시적으로 동의되므로 오류가 발생하기 쉽습니다.

DetachedCriteria는 이 문제를 해결할 수 있습니다. 즉, 웹 계층에서 프로그래머는 DetachedCriteria를 사용하여 쿼리 조건을 구성한 다음 이 DetachedCriteria를 메서드 호출 매개 변수로 비즈니스 계층 개체에 전달합니다. 비즈니스 계층 개체가 DetachedCriteria를 얻은 후 쿼리를 위한 session 범위 내에서 Criteria를 직접 구성할 수 있습니다. 이와 관련하여 쿼리 문의 구성은 구현을 위해 완전히 웹 레이어로 이동되었으며, 비즈니스 레이어는 쿼리의 지속성 및 캡슐화만 담당하며 쿼리 조건 구성과 완전히 분리되어 완벽합니다.

Criteria와 DetachedCriteria

의 주요 차이점은 Criteria가 온라인이므로 Hibernate Session에 의해 생성되는 반면 DetachedCriteria는 오프라인이므로 생성 시 세션이 필요하지 않다는 것이다.

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

age가 (eq) 20과 같거나 (또는) age가 비어 있는 (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();

동적 연관 크롤링

저희 크롤링 모드는 일대다 연관 형태입니다! 캡쳐됐나요?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.