千家信息网

Hibernate的Criteria Query是什么

发表于:2025-11-12 作者:千家信息网编辑
千家信息网最后更新 2025年11月12日,本篇内容主要讲解"Hibernate的Criteria Query是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hibernate的Criteria
千家信息网最后更新 2025年11月12日Hibernate的Criteria Query是什么

本篇内容主要讲解"Hibernate的Criteria Query是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hibernate的Criteria Query是什么"吧!

Criteria Query通过面向对象的设计,将数据查询条件封装为一个对象。简单来说,Criteria Query可以看作是传统SQL的对象化表示,如:

Criteria criteria=session.createCriteria(TUser.class);  criteria.add(Expression.eq("name","Erica"));  criteria.add(Expression.eq("sex",new Integer(1));

这里的criteria实例本质上是对SQL"select * from t_user where name='Erica' and sex=1"的封装。Hibernate在运行期会根据Criteria中指定的查询条件生成相应的SQL语句。

Criteria查询表达式:Criteria本身只是一个容器,具体的查询条件要通过Criteria.add方法添加到Criteria实例中。

方法描述:Expression.eq 对应SQL "field=value"表达式

如:Expression.eq("name","Erica")

Expression.allEq 参数为一个Map对象,其中包含了多个属性-值对应关系。相当于多个Expression.eq关系的叠加   Expression.gt 对应SQL"field>value"表达式   Expression.ge 对应SQL"field>=value"表达式   Expression.lt 对应SQL"field

如:

Expression.between("age",new Integer(13),new Integer(50));   Expression.like 对应SQL"field like valule"表达式   Expression.in 对应SQL"field in..."表达式   Expression.eqproperty 用于比较两个属性之间的值,对应SQL"field>field"   Expression.gtProperty 用于比较两个属性之间的值,对应SQL"field>=field"   Expression.ltProperty 用于比较两个属性之间的值,对应SQL"field

下面的代码返回所有名称以"Erica"其实的记录:

Expression.sql("lower({alias}.name) like lower(?)","Erica%",Hibernate.STRING);

其中的"{alias}"将Hibernate在运行期使用当前关联的POJO别名替换,在Hibernate3中,引入了Restrictions类作为Expression的替代。

示例查询:

Example类实现了Criteria接口,同样,它也可以用作Criteria的查询条件。Example的作用是:根据已有对象,查找属性与之相符的其他对象。

Criteria criteria=session.CreateCriteria(TUser.class);  TUser exampleUser=new TUser();  exapleUser.getName("Erica");  criteria.add(Example.create(exampleUser));  List list=criteria.list();  for(TUser user:list){  System.out.println(user.getName());  }

新建一个TUser对象exampleUser,并作为范本,查询所有name属性与之相同的记录。

复合查询:

Criteria criteria=session.createCriteria(TUser.class);  Criteria addrCriteria=criteria.createCriteria("addresses");  addrCriteria.add(Expression.like("addresses","%shanghai%"));   List list = criteria.list();  for(TUser user:list){      System.out.println(user.getName());      Set addrSet=user.getAddresses();      for(TAddress addr:addrSet){          System.out.println(addr.getAddress());      }  }

深色部分就是我们新增的复合查询条件,可以看到,我们可以通过Criteria.createCriteria方法在原有Criteria对象的基础上构建复合查询。

DetachedCriteria:

Hibernate2中,Criteria生命周期位于其宿主Session生命周期中,也就是说,由某个session创建的Criteria实例,一旦session销毁,那么此Criteria实例也随之失效。

Hibernate3中引入了DetachedCriteria,DetachedCriteria可以脱离session实例独立存在,这样,我们就可以将某些通用的Criteria查询条件进行抽离,每次使用时再与当前session实例绑定以获得更好的代码重用效果。

DetachedCriteria deCriteria=DetachedCriteria.forClass(TUser.class);  deCriteria.add(Expression.eq("name","Erica"));  deCriteria.add(Expression.eq("sex",new Integer(1)));  Criteria criteria=deCriteria.getExecutableCriteria(session);  List list=criteria.list();  for(TUser user:list){      System.out.println(user.getName());  }

DetachedCriteria的生存周期与session实例无关,我们可以独立创建DetachedCriteria实例,并在需要使用时与session相绑定,从而获得运行期Criteria实例。这样,我们就可以将查询逻辑和Criteria实例分离,以获得***化代码的重用效果。

DetachedCriteria也可以用于子查询表达:

DetachedCriteria aveAge=DetachedCriteria.forClass(TUser.class);  avgAge.setProjection(Projections.avg("age"));  Criteria criteria=session.createCriteria(TUser.class);  criteria.add(Subqueries.propertyGT("age",avgAge));

通过Subqueries我们可以将DetachedCriteria纳入查询表达式,反映在SQL上则是一个典型的子查询语句。上例生成的SQL语句大致如:select ... from T_User where age > (select avg(age) from T_User)

Criteria高级特性,限定返回的记录范围,通过criteria.setFirstResult/setMaxResults方法可以限制一次查询返回的记录范围:

Criteria criteria=session.createCriteria(TUser.class);  //限定查询返回检索结果中,从100条结果开始的20条记录  criteria.setFirstResult(100);  criteria.setMaxResults(20);        记录排序:  //  //  Criteria criteria=session.createCriteria(TUser.class);  criteria.add(Expression.eq("groupId",new Integer(2)));   criteria.addOrder(Order.asc("name"));  criteria.addOrder(Order.desc("groupId"));

分组与统计:

在Hibernate3中,我们还可以通过Criteria完成分组和统计。分组、统计表达式由Hibernate3新引入的Projections Class进行封装。

Criteria criteria=session.createCriteria(TUser.class);  criteria.setProjection(Projections.groupProperty("age"));  List list=criteria.list();  for(TUser user:list){      System.out.println(user);  }

上例对当前的TUser记录按照年龄进行分组。通过Projections.groupProperty方法,我们指定了用于分组的目标属性"age"。生成的SQL语句:select this.age as y0_ from T_User this_group by this_.age。另外,对于多条件组合的统计、分组功能,我们可以借助ProjectionList完成,下面的例子中,我们统计了各个年龄层次中的用户数量:

ProjectionList projectionlist=Projections.ProjectionList();  projectionList.add(Projections.groupProperty("age"));  projectionList.add9Projections.rowCount());  Criteria criteria=session.createCriteria(TUser.class);  criteria.setProjection(projectionList);

到此,相信大家对"Hibernate的Criteria Query是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

查询 表达式 实例 对象 属性 条件 方法 分组 语句 统计 两个 之间 代码 可以通过 周期 行期 封装 生成 组合 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 如何知道数据库版本信息 浙江浪潮服务器维修技术 服务器内部跳转方法 计算机信息网络技术基础教学 软件开发企业目标客户描述 数据库什么叫做主属性 国家网络安全手抄抄报学生 信息化网络技术服务口碑推荐 有关数据库新闻的最新动态 学校网络安全周教育心得 美军网络技术 商业运营数据库 软件开发人才群 学软件开发还是模具设计 数据库查询平均分最高的学生姓名 北京中大网校软件开发 vb拖拽获取数据库 娄底串口服务器费用 腾讯网络技术岗位面试题 方舟生存进化服务器弹出回主界面 连接互联网的单独服务器是否安全 服务器部署静态资源nginx 传奇怎么设置服务器时间 数据库如何给应用程序连接 web服务器 c语言 郏县精算互联网科技有限公司 2019国家网络安全周答题 全国网络安全基础知识竞赛 数据库图书管理系统需求报告 软件开发部门的人员职位
0