1.标准查询简介

2.比较运算符

3.分页使用标准

4.排序结果

5.预测与聚合

6.关联

7. 动态关联抓取

8.查询示例

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

10. 离线(detached)查询和子查询

1.标准查询简介(QBC:Query By Criteria)

Hibernate 提供了操纵对象和相应的 RDBMS 表中可用的数据的替代方法。一种方法是标准的 API,它允许你建立一个标准的可编程查询对象来应用过滤规则和逻辑条件。

Hibernate Session 接口提供了 createCriteria() 方法,可用于创建一个 Criteria 对象,使当您的应用程序执行一个标准查询时返回一个持久化对象的类的实例。

以下是一个最简单的标准查询的例子

Criteria cr = session.createCriteria(Employee.class);
List results = cr.list();

QBC (Query By Criteria) 主要有Criteria,Criterion,Oder,Restrictions类组成

@Override
public List<Role> getAllRoles() {
// TODO Auto-generated method stub List<Role> roles = null;
Session session =sessionFactory.getCurrentSession(); Criteria criteria = session.createCriteria(Role.class);
Criterion criterion = Restrictions.eq("roleServer", "一梦十年");
criteria.add(criterion);
roles = criteria.list(); return roles;
}

2.比较运算符

=   Restrictions.eq() 等于
<>   Restrictions.not(Exprission.eq()) 不等于
>   Restrictions.gt() 大于
>=   Restrictions.ge() 大于等于
<   Restrictions.lt() 小于
<=   Restrictions.le() 小于等于
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() 等于列表中的某一个值
ont in(列表)   Restrictions.not(Restrictions.in())不等于列表中任意一个值
between x and y   Restrictions.between() 闭区间xy中的任意值
not between x and y   Restrictions.not(Restrictions..between()) 小于值X或者大于值y

 使用逻辑表达式创建 in 的条件组合

  cri.add(Restrictions.in("chcStatus", new Object[]{"2","3","4"})); 

使用逻辑表达式创建 AND 或 OR 的条件组合

  @Override
public List<Role> getAllRoles() {
// TODO Auto-generated method stub List<Role> roles = null;
Session session =sessionFactory.getCurrentSession(); Criteria criteria = session.createCriteria(Role.class);
Criterion serverName = Restrictions.eq("roleServer", "一梦十年");
Criterion userOrder = Restrictions.eq("roleOrder", 1);
LogicalExpression andExp = Restrictions.and(serverName, userOrder);
criteria.add(andExp);
return roles;
}

你可以直接使用SQL。

List cats = sess.createCriteria(Cat.class) 

.add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", 

Hibernate.STRING) )

.list();

{alias}占位符应当被替换为被查询实体的列别名。

Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property。

Property age = Property.forName("age"); 

List cats = sess.createCriteria(Cat.class)
.add( Restrictions.disjunction()
.add( age.isNull() )
.add( age.eq( new Integer(0) ) )
.add( age.eq( new Integer(1) ) )
.add( age.eq( new Integer(2) ) )
) )
.add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) ) .list();

3.分页使用标准

这里有两种分页标准接口方法:

序号 方法描述
1 public Criteria setFirstResult(int firstResult),这种方法需要一个代表你的结果集的第一行的整数,以第 0 行为开始。
2 public Criteria setMaxResults(int maxResults),这个方法设置了 Hibernate 检索对象的 maxResults

利用上述两种方法结合在一起,我们可以在我们的 Web 或 Swing 应用程序构建一个分页组件。以下是一个例子,利用它你可以一次取出 10 行:

Criteria cr = session.createCriteria(Employee.class);
cr.setFirstResult(1);
cr.setMaxResults(10);
List results = cr.list();

4.排序结果

标准 API 提供了 org.hibernate.criterion.order 类可以去根据你的一个对象的属性把你的排序结果集按升序或降序排列。这个例子演示了如何使用 Order 类对结果集进行排序:

Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000)); // To sort records in descening order
crit.addOrder(Order.desc("salary")); // To sort records in ascending order
crit.addOrder(Order.asc("salary")); List results = cr.list();

5.预测与聚合

标准 API 提供了 org.hibernate.criterion.projections 类可得到各属性值的平均值,最大值或最小值。Projections 类与 Restrictions 类相似,均提供了几个获取预测实例的静态工厂方法。

以下是几个例子,涵盖了不同的情况,可按要求进行使用:

Criteria cr = session.createCriteria(Employee.class);

// To get total row count.
cr.setProjection(Projections.rowCount()); // To get average of a property.
cr.setProjection(Projections.avg("salary")); // To get distinct count of a property.
cr.setProjection(Projections.countDistinct("firstName")); // To get maximum of a property.
cr.setProjection(Projections.max("salary")); // To get minimum of a property.
cr.setProjection(Projections.min("salary")); // To get sum of a property.
cr.setProjection(Projections.sum("salary"));

 6.关联

你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。

List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.createCriteria("kittens")
.add( Restrictions.like("name", "F%")
.list();

注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。

接下来,替换形态在某些情况下也是很有用的。

list cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add( Restrictions.eqProperty("kt.name", "mt.name") )
.list();

(createAlias()并不创建一个新的 Criteria实例。)

Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得符合条件的kittens, 你必须使用returnMaps()。

List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Restrictions.eq("name", "F%") )
.returnMaps()
.list(); Iterator iter = cats.iterator();
while ( iter.hasNext() ) {
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Cat kitten = (Cat) map.get("kt");
}

16.5. 动态关联抓取

你可以使用setFetchMode()在运行时定义动态关联抓取的语义。

List cats = sess.createCriteria(Cat.class)

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

.setFetchMode("mate", FetchMode.EAGER)

.setFetchMode("kittens", FetchMode.EAGER)

.list();

这个查询可以通过外连接抓取mate和kittens。

8.查询示例

org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。

     Role role = null;
Session session = sessionFactory.getCurrentSession(); Role demoRole = new Role();
demoRole.setRoleSect("星宿"); Example example = Example.create(demoRole).excludeZeroes() ;
Criteria criteria = session.createCriteria(Role.class); List<Role> roles =criteria.add(example).list();

注意:如何实体类中如果有int 或者doubole 类型的值而没有设置值,一定要加 excludeZeroes() 条件

版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。

你可以自行调整Example使之更实用。

Example example = Example.create(cat)

.excludeZeroes() //exclude zero valued properties

.excludeProperty("color") //exclude the property named "color"

.ignoreCase() //perform case insensitive string comparisons 

.enableLike(); //use like for string comparisons 

List results = session.createCriteria(Cat.class) 

.add(example) 

.list();

你甚至可以使用examples在关联对象上放置条件。

List results = session.createCriteria(Cat.class) 

.add( Example.create(cat) ) 

.createCriteria("mate")

.add( Example.create( cat.getMate() ) ) 

.list();

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

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

org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 setProjection()应用投影到一个查询。

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(); List results = session.createCriteria(Domestic.class, "cat") .createAlias("kittens", "kit") .setProjection( Projections.projectionList() .add( Projections.property("cat.name"), "catName" ) .add( Projections.property("kit.name"), "kitName" ) )
.addOrder( Order.asc("catName") ) .addOrder( Order.asc("kitName") ) .list(); 你也可以使用Property.forName()来表示投影: List results = session.createCriteria(Cat.class) .setProjection( Property.forName("name") ) .add( Property.forName("color").eq(Color.BLACK) ) .list(); 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();

10. 离线(detached)查询和子查询

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

DetachedCriteria query = DetachedCriteria.forClass(Cat.class) 

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

Session session = ....; 

Transaction txn = session.beginTransaction(); 

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

txn.commit(); 

session.close();

DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者Property获得。

DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class) 

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

session.createCriteria(Cat.class) 

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

.list(); 

DetachedCriteria weights = DetachedCriteria.forClass(Cat.class) 

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

session.createCriteria(Cat.class) 

.add( Subqueries.geAll("weight", weights) ) 

.list();

甚至相互关联的子查询也是有可能的:

DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2") 

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

.add( Property.forName("cat2.sex").eqProperty("cat.sex") ); 

session.createCriteria(Cat.class, "cat") 

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

.list();

Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。

Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的;而 DetachedCriteria 是离线的,

创建时无需 Session,DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name)

进行DetachedCriteria 实例的创建。 Spring 的框架提供了getHibernateTemplate ().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结果。

Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置查询条件。可以设

置 FetchMode( 联合查询抓取的模式 ) ,设置排序方式。对于 Criteria 还可以设置 FlushModel

(冲刷 Session 的方式)和 LockMode (数据库锁模式)。

Hibernate Criteria用法大全的更多相关文章

  1. 1-4 criteria用法大全

    Criteria的完整用法 QBE (Query By Example) Criteria cri = session.createCriteria(Student.class); cri.add(E ...

  2. 【hibernate criteria】hibernate中criteria的完整用法 转

    ---恢复内容开始--- 转自:http://www.360doc.com/content/090313/10/26262_2794855.html 1.Criteria Hibernate 设计了 ...

  3. Hibernate Criteria使用

    hibernate中Criteria的完整用法 Criteria 是一个完全面向对象,可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现.SQL语句如何编写,是Hibernate框架的核心 ...

  4. Hibernate Criteria 查询使用

    转载 http://blog.csdn.net/woshisap/article/details/6747466 Hibernate 设计了 CriteriaSpecification 作为 Crit ...

  5. atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria

    atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria 1. 关键字 1 2. 统计功能框架普通有有些条件选项...一个日期选项..一个日期类型(日,周,月份 ...

  6. MVC5 + EF6 + Bootstrap3 (9) HtmlHelper用法大全(下)

    文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-httphelper-part2.html 上一节 ...

  7. MVC5 + EF6 + Bootstrap3 (8) HtmlHelper用法大全(上)

    文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-httphelper-part1.html 上一节 ...

  8. MVC HtmlHelper用法大全

    MVC HtmlHelper用法大全HtmlHelper用来在视图中呈现 HTML 控件.以下列表显示了当前可用的一些 HTML 帮助器. 本主题演示所列出的带有星号 (*) 的帮助器. ·Actio ...

  9. [Hibernate] - Criteria Select

    使用Hibernate的Criteria做查询. 参考文档: http://docs.jboss.org/hibernate/orm/3.5/reference/zh-CN/html/querycri ...

随机推荐

  1. PHP多进程系列笔记(五)

    前面几节都是讲解pcntl扩展实现的多进程程序.本节给大家介绍swoole扩展的swoole_process模块. swoole多进程 swoole_process 是swoole提供的进程管理模块, ...

  2. Shell脚本 | 一键获取安卓应用活动名

    上篇文章提到,启动时间的计算需要用到应用启动页的活动名(Activity_Name). 如何获取活动名呢?通常有如下几种方式: 1.询问 Dev 同事 2.adb logcat ActivityMan ...

  3. 你真的理解编码吗?unicode,utf8,utf16详解

    背景 前两天在网上看到一篇关于编码的讨论,仔细学习了一下unicode,utf8,utf16的定义.这篇博客旨在让读者真正理解他们是什么. 什么是编码 在阅读本文之前建议读者先去阅读这篇文章:http ...

  4. 「每日一码」a&b赋值问题

    每日一码 将每天看到的优秀的代码或者特别的实现,记录下来 a&b赋值问题 2019-2-18 var a = {n: 1}; var b = a; a.x = a = {n: 2}; Q&am ...

  5. Solidity字符串和函数

    字符串:需要使用双引号""或者单引号''括起来,例如:定义一个字符串变量:string name="jake":string字符串不能通过length方法获得长 ...

  6. IC 设计中DFT的Boundary Scan功能

    在很大规模的IC设计中,往往会有一些各种各样的bug出现,不论是在前期design的过程,还是在post silicon流片回来chip的flaw,都会导致chip的功能的失败,时钟频率无法达到期望频 ...

  7. 软件架构设计学习总结(3):QQ空间技术架构之详解

    QQ空间作为腾讯海量互联网服务产品,经过近七年的发展,实现了从十万级到亿级同时在线的飞跃.在这个过程中,QQ空间团队遇到了哪些技术挑战?其站点前后台架构随着业务规模的变化又进行了怎样的演进与变迁?成长 ...

  8. eclise linux c mysql

  9. Spring事务传播属性介绍(二).mandatory、not_supported、never、supports

    Required.Required_New传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10259897.html Nested传播属性分析传送 ...

  10. AngularJS学习笔记(二)MVVM

    什么是MVVM MVVM模式是Model-View-ViewMode模式的简称. 由视图(View).视图模型(ViewModel).模型(Model)三部分组成,通过这三部分实现UI逻辑.呈现逻辑和 ...