Hibernate 的 Criteria的用法

从零到一:高通Memory QMVS测试环境搭建的避坑指南 本文详细介绍了高通Memory QMVS测试环境搭建的全流程避坑指南,涵盖硬件选择、软件配置、QMVS核心组件安装及测试执行技巧。重点解析了adb工具配置、QPST日志抓取等关键步骤,帮助工程师高效搭建稳定测试环境,避免常见兼容性和稳定性问题。 阅读详情
复合查询主要是处理,具有关联关系的两个实体怎样进行关联查询,比如 User 实体对象与 Addres 实体对象具有一对多的关联关系,我们可以如下构造符合查询:
Criteria criteria=session.createCriteria(User.class);
   Criteria addcriteria=criteria.createCriteria(“addresses”);(1)
   addcriteria.add(Express.like(“address”,”%tianjin%”));
   List list=criteria.list();
   for(int i=0;i
     User user=(User)list.get(i);
     System.out.println(user.getName()+”/n”);
     Set addresses=user.getAddresses();
     Iterator it=addresses.iterator();
     while(it.hasNext(){
      Address address=(Address)it.next();
      System.out.println(address.getAddress()+”/n”);
     }
   }
当执行到了( 1 )处时,表明要针对 User 对象的 addresses 属性添加新的查询条件,因此当执行 criteria.list() 时, Hibernate 会生成类似如下的 SQL 语句:
Select * from user inner join address on user.id=address.id where address.address like ‘%shanghai%’;
正如我们所见,我们可以通过向 Criteria 中添加保存关联对象的集合属性( addresses 属性保存与 User 对象相关联的 Address 对象),来构造复合查询,在数据库一端是通过内连接查询来实现。
 
相关:
1. Hibernate
2. Hibernate QBC查询

QBC 查询:
   QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口。我们看下面的示例程序:
Criteria criteria=session.createCriteria(User.class);
criteria.add(Expression.eq(“name”,”zx”));
criteria.add(Expression.eq(“age”,new Integer(27));
List list=criteria.list();
当执行 criteria.list() 时会生成类似这样的 SQL 语句: Select * from user where name=’zx’ and age=27; 所以在这里我们可以看出, Criteria 实际上是一个查询容器,它对查询条件表达式的添加进行了封装,具体的查询条件是通过 add() 方法添加的,而且具体的查询条件的表达式运算是通过 Expression 指定的。 Hibernate 在运行期会根据 Criteria 指定的表达式条件来添加查询条件,并且生成查询语句。这种方式非常符合 Java 以及所有面向对象编程语言的编程方式,所以大多数的持久层框架都提供了对这种方式查询的支持。下面我们讲解这种查询方式的各个技术细节。
1、 Criteria 查询表达式:
正如我们所见, Expression 对查询语句的表达式进行了封装和限制,下表列出了 Expression 所有的方法,以及每个方法所对应的查询表达式及其限制。

方法
描述
Expression.eq
对应 SQL 的“ field=value ”表达式
如: Expression.eq(“name”,”zx”);
Expression.allEq
方法的参数为一个 Map 类型对象,包含多个名 / 值对对应关系,相当于多个 Expression.eq 的叠加
Expression.gt
对应 SQL 的“ field>value ”表达式
Expression.ge
对应 SQL 的“ field>=value ”表达式
Expression.lt
对应 SQL 的“ field ”表达式
Expression.le
对应 SQL 的“ field<=value ”表达式
Expression.between
对应 SQL 语句的 between 表达式,如:查询年龄在 21 与 27 岁之间的用户,可以写成 Expression.between(“age”,new Integer(21),new Integer(27));
Expression.like
对应 SQL 语句的 ”field like value” 表达式
Expression.in
对应 SQL 语句的“ field in(……) ”表达式
Expression.eqProperty
用于比较两个属性值,对应 ”field=field”SQL 表达式
Expression.gtProperty
用于比较两个属性值,对应 ”field>field”SQL 表达式
Expression.geProperty
用于比较两个属性值,对应 ”field>=field”SQL 表达式
Expression.ltProperty
用于比较两个属性值,对应 ”field 表达式
Expression.leProperty
用于比较两个属性值,对应 ”field<=field”SQL 表达式
Expression.and
对应 SQL 语句的 And 关系组合,如: Expression.and(Expression.eq(“name”,”zx”),Expression.eq(“sex”,”1”));
Expression.or
对应 SQL 语句的 Or 关系组合,如: Expression.or(Expression.eq(“name”,”zx”),Expression.eq(“name”,”zhaoxin”));
Expression.sql
作为补充这个方法提供了原生 SQL 语句查询的支持,在执行时直接通过原生 SQL 语句进行限定,如: Expression.sql(“lower({alias}.name) like (?)”,“zhao%”,Hibernate.STRING) ; 在运行时 { alias } 将会由当前查询所关联的实体类名替换, () 中的 ? 将会由 ”zhao%” 替换,并且类型由 Hibernate.STRING 指定。

注意: Expression 各方法中的属性参数(各方法中的第一个参数)所指定的属性名称(如: name,sex ),并不是数据库表中的实际字段名称,而是实体对象中映射实际数据表字段的类属性名称。
 
2、 示例查询:
   示例查询是通过 Example 类来完成的, Example 类实现了 Criterion 接口,可以用作 Criteria 查询条件, Example 类的作用是:根据已有对象,查询属性值与之相同的其他对象。如下代码所示:
Criteria criteria=session.createCriteria(User.class);
User exampleuser=new User(“zx”);
criteria.add(Example.create(exampleuser));
List list=criteria.list();
for(int i=0;i
   User user=(User)list.get(i);
   System.out.println(user.getName()+”/n”);
}
上述代码中 User exampleuser=new User(“zx”);criteria.add(Example.create(exampleuser)); 两句相当于
criteria.add(Expression.eq(“name”,”zx”)); 因此会生成类似如下的 SQL 语句:
select * from user where name=’zx’; 在上面的代码中 exampleuser 称为示例对象。
   在 Hibernate 中队示例查询,默认情况下会排除掉示例对象中属性值为空的属性,还可以调用 Example.excludeNone (排除空串值) /excludeZeros (排除零值),或者调用 Example.excludeProperty 方法来指定排除特定属性。
   示例查询主要应用于组合查询中,比如根据用户输入的查询条件动态生成最终的查询语句,通过使用示例查询,可以避免由于查询条件过多而写的大量 if 判断语句。
3、 复合查询:
复合查询主要是处理,具有关联关系的两个实体怎样进行关联查询,比如 User 实体对象与 Addres 实体对象具有一对多的关联关系,我们可以如下构造符合查询:
Criteria criteria=session.createCriteria(User.class);
   Criteria addcriteria=criteria.createCriteria(“addresses”);(1)
   addcriteria.add(Express.like(“address”,”%tianjin%”));
   List list=criteria.list();
   for(int i=0;i
     User user=(User)list.get(i);
     System.out.println(user.getName()+”/n”);
     Set addresses=user.getAddresses();
     Iterator it=addresses.iterator();
     while(it.hasNext(){
      Address address=(Address)it.next();
      System.out.println(address.getAddress()+”/n”);
     }
   }
当执行到了( 1 )处时,表明要针对 User 对象的 addresses 属性添加新的查询条件,因此当执行 criteria.list() 时, Hibernate 会生成类似如下的 SQL 语句:
Select * from user inner join address on user.id=address.id where address.address like ‘%shanghai%’;
正如我们所见,我们可以通过向 Criteria 中添加保存关联对象的集合属性( addresses 属性保存与 User 对象相关联的 Address 对象),来构造复合查询,在数据库一端是通过内连接查询来实现。
 
4、 Criteria 的高级特性:
A、 限定返回记录条数:
  我们可以通过利用 Criteria.setFirstResult/setMaxResult 方法来限定返回某一次查询的记录数,如下代码:
Criteria criteria=session.createCriteria(User.class);
criteria.setFirstResult(100);
criteria.setMaxResult(200);
通过以上代码可以设定该次查询返回 user 表中的从第 100 条记录开始直到第 200 条记录结束的 100 条记录。
B、 对查询结果进行排序:
  可通过使用 net.sf.hibernate.expression.Order 类可以对查询结果集进行排序,如下面代码:
Criteria criteria=session.createCriteria(User.class);
criteria.add(Expression.eq(“groupid”,”2”);
criteria.addOrder(Order.asc(“name”));
criteria.addOrder(Order.desc(“groupid”));
List list=criteria.list();
通过使用 Order 类的 asc()/desc() 方法,可以指定针对某个字段的排序逻辑,如果执行上述代码,会生成类似如下的 SQL 语句:
Select * from user where groupid=’2’ order by name asc,groupid desc
C、 分组与统计:
   在 Hibernate3 中,对 Criteria 又增添了新功能,可以支持分组与统计功能,在 Hibernate3 中增加了 Projections 以及 ProjectionList 类,这两个类对分组与统计功能进行了封装,如下代码:
Criteria criteria=session.createCriteria(User.class);
criteria.setProjection(Projections.groupProperty(“age”));(1)
List list=criteria.list();
Iterator it=list.iterator();
while(it.hasNext()){
 System.out.println(it.next());
}
通过( 1 )处的代码,我们通过 Projections 类指定了用于分组的目标属性,当进行检索时 Hibernate 会生成类似如下的 SQL 语句:
Select age from user group by age;
还可以通过使用 Projections 的 avg()/rowCount()/count()/max()/min()/countDistinct() 等方法来实现统计功能,如下面的代码示例:
Criteria criteria=session.createCriteria(User.class);
criteria.setProjection(Projections.avg(“age”));(1)
List list=criteria.list();
Iterator it=list.iterator();
while(it.hasNext()){
 System.out.println(it.next());
}
通过( 1 )处的代码,我们实现了对用户平均年龄的统计,当进行检索时, Hibernate 会生成类似如下的 SQL 语句:
Select avg(age) from user;
另外,在 SQL 语句中的多条件分组与统计功能,可以利用 ProjectionList 类来实现,如下面代码所示:
Criteria criteria=session.createCriteria(User.class);
ProjectionList prolist=Projections.projectionList();
prolist.add(Projections.groupProperty(“age”));
prolist.add(Projections.rowCount());
criteria.setProjection(prolist);
List list=criteria.list();
通过以上代码,实现了对不同年龄人员数量的分组统计,当进行检索时, Hibernate 会生成类似如下的 SQL 语句:
Select age,count(*) from user group by age;
5、 DetachedCriteria:
在 Hibernate2 中, Criteria 实例是与创建它的 Session 实例具有相同的生命周期的,也就是说, Session 实例是它所创建的 Criteria 实例的宿主,当 Session 关闭时,寄生于 Session 实例的 Criteria 都将失效。这就对 Criteria 的重用造成了困难,为了实现 Criteria 实例的重用,在 Hibernate3 中提供了一个 DetachedCriteria 类, DetachedCriteria 实例的生命周期与 Session 实例的生命周期无关,我们可以利用 DetachedCriteria 对一些常用的 Criteria 查询条件进行抽离,当需要进行检索时再与 Session 实例关联,从而获得运行期的 Criteria 实例。如下面的代码所示:
   DetachedCriteria dc= DetachedCriteria.forClass(User.class);
   dc.add(Expression.eq(“name”,”zhaoxin”));
   dc.add(Expression.eq(“sex”,”1”));
   Criteria criteria=dc.getExecutableCriteria(session);
   Iterator it=criteria.list().iterator();
   while(it.hasNext()){
     User user=(User)it.next();
     System.out.println(user.getName());
   }
  正如我们所见, DetachedCriteria 的生存周期与 session 实例无关,当需要进行检索时,通过 getExecutableCriteria(session) 方法,与当前的 Session 实例关联并获得运行期的 Criteria 实例,完成检索。
DetachedCriteria 也可以用于完成子查询功能,如下代码所示:
DetachedCriteria dc= DetachedCriteria.forClass(User.class);
dc.setProjection(Projections.avg(“age”));
Criteria criteria=session.createCriteria(User.class);
criteria.add(Subqueries.propertyGt(“age”,dc));
List list=criteria.list();
通过 Subqueries 类,实现了添加子查询的功能,我们将 DetachedCriteria 所设定的查询条件,当作子查询添加到了运行时 Criteria 实例的查询条件中,当执行检索时 Hibernate 会生成类似如下的 SQL 语句:
Select * from user where age>(select avg(age) from user group by age);

6 、关联的PO对象的属性值也是对象时采用如下方式查询。
DetachedCriteria   dc   =   DetachedCriteria.forClass(TUsercompanyinfo.class);    
dc.addOrder(Order.desc("usercompanyinfoid"));  
dc.add(Property.forName("corporateperson").isNotNull());  
                   
dc.createAlias("status","s");    
dc.add(Property.forName("s.statusid").eq(new   Long(2)));  
dc.createAlias("userinfo","i");    
dc.createAlias("i.user","u");  
dc.createAlias("u.function","f");          
dc.add(Property.forName("f.functionid").ne(new   Long(6)));  
 
dc.createAlias("language","l");        
dc.add(Property.forName("l.languageid").eq(new   Long(languageId)));  
List   list   =this.findNumberByCriteria(dc,40);

ORB-SLAM3代码详解 - 第 18 篇 · Atlas 多地图系统、地图保存与全系统调优 会跑:理解三线程架构与数据流(01/08/10/13),能编译、配参、复现各数据集结果。会改:掌握相机模型抽象(05)、g2o 顶点与边(14)、预积分(15),能接入新传感器、新相机、新约束。会调:理解每个参数背后的物理含义与耦合(03/15/16/18),能针对自己的平台与场景做精度/实时/鲁棒的权衡。ORB-SLAM3 的价值不止于一个可用的 SLAM 系统,更在于它是一套工程化的几何状态估计模板:清晰的模块边界、可替换的相机/传感器抽象、紧耦合优化的标准范式。 阅读详情

相关推荐

基于PSINS的INS/NHC/ODO组合导航仿真全解析

组合导航通过多传感器融合克服单一导航系统的局限,是车辆自主定位的关键技术。其中惯性导航(INS)依靠陀螺仪与加速度计积分推算运动状态,但误差随时间累积;GNSS提供绝对位置,却在城市峡谷中易受多径效应和遮挡影响导致定位漂移。卡尔曼滤波作为信息融合核心,将不同量测按统计特性加权,实现优势互补。基于PSINS开源工具箱搭建的SINS/GNSS/ODO/NHC组合导航仿真,能够在GNSS失锁条件下利用非完整约束和里程计抑制惯性误差发散,广泛应用于无人驾驶、物流车辆自主定位等场景。本文围绕PSINS仿真环境,详细拆

weixin_29044713的博客 253

criteria.setProjection(Projectio…

criteria.setProjection(Projections.id()); 指criteria查询只返回表中id的数据, criteria.setProjection(Projections.id());和 criteria.setProjection(Projections.property("id"));效果一样! 调用 setProjection()应用投影到一个查询,返回结果集合l

随便起个不重复的名字 4755

稚晖君Dummy机械臂CAN总线控制详解:从代码到实战(附常见问题排查)

本文深入解析了稚晖君Dummy机械臂的CAN总线控制技术,从协议设计到代码实现,详细介绍了CAN总线在机械臂控制中的核心价值、通信协议栈设计、运动控制指令实现及常见问题排查方法。通过实战案例和代码示例,帮助开发者快速掌握机械臂CAN总线控制的关键技术。

uuu88的博客 295

GDALSetProjection使用的一个注意事项

GDALSetProjection 简述 GDALSetProjection是用来给GDALDataset设定投影信息(坐标系统)的接口,实际上是GDALDataset::SetProjection这个虚函数的转调而已。官网文档描述如下: CPLErr GDALDataset::SetProjection (const char * pszProjection ) Set the projec...

weixin_34261739的博客 1772

飞凌OK3588-C Linux R4系统下MIPI YUV摄像头CSI尺寸错误排查与极性适配方案

本文详细介绍了在飞凌OK3588-C平台的Linux R4系统下调试MIPI YUV摄像头时遇到的'csi size err'错误排查与极性适配方案。通过分析信号极性、驱动参数调整及FPGA协同调试,提供了从硬件检测到系统级调试的完整解决方案,帮助开发者快速解决类似问题。

bean的博客 258

【数据结构】汉诺塔问题(丰富图解)

经典汉诺塔问题,丰富图解,助你理解。

℉f的博客 4105

Hibernate QBC查询

 QBC查询:   QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。我们看下面的示例程序:Criteria criteria=session.createCriteria(User.class);criteria.add(Expression.eq(“nam

javacoffe的专栏 5623

2.4G跳频算法 2.4G切信道算法 (简例示意nRF52832)

2.4G跳频算法 nRF52832示例 2.4G自适应信道算法

Peter.Min 956

总结Criteria的简要使用概述(Hibernate5.2+)

Criteria是Hibernate框架提供的一套面向对象查询API,在Hibernate5.2以后做了相关调整,写法上有些不同,但本意没变。现对其进行归纳汇总,进行前后使用对比。

敬业丨小爷 3412

使用YOLOv5进行工业检测(如裂纹、划痕、破损等)

本文将详细介绍如何使用YOLOv5实现工业检测项目,以检测生产线上的缺陷产品,如裂纹、划痕、破损等。我们将分步介绍数据准备、模型训练、模型优化和部署等过程。

a871923942的博客 2528

【华为OD技术面试手撕真题】1、长度最小的子数组 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)(三种解法)

【华为OD面试手撕真题】长度最小的子数组,本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS),思路分析都非常详细, 实现最低的时间复杂度和高通过率,每个解题思路超过百字,内含各个编程语言的八股文面试题,欢迎大家订阅学习, 代码可以直接运行使用,全网限时最低价,持续更新

KJ.JK 1万+

Android 10 如何在SurfaceFlinger中解决开机动画显示不全问题

Android 10 如何在SurfaceFlinger中解决开机动画显示不全问题

Android framework 884

【Qt】解决 FTH: (11284): *** Fault tolerant heap shim applied to current process. (亲测有效)

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers。容错堆垫片应用到当前的过程。这通常是由于以前的崩溃。win + r,输入regedit。

Fanjufei的博客 830

Hibernate中Criteria的完整用法

标题Hibernate中Criteria的完整用法 1,Criteria Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。 2,DetachedCriteria Spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结果。Detache

Fzzf 3518

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Hibernate的Criteria 的用法进行总结:

Hibernate的Criteria 的用法进行总结: Hibernate的Criteria 的用法进行总结: Java代码 Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。 Criteria 和 DetachedCriteria 的主要区别在于创建的形式

jianhuili的优快云博客 1789

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Hibernate之Criteria查询

Hibernate中提供了三种查询方式,分别为HQL、Criteria查询、本地化SQL查询,实际应用中,有很多人忽略了Criteria的用处,觉得不如另外两种贴近SQL方式便捷,实际则未必,很多情况下Criteria更具有优势;本篇文章就对Criteria查询做一个全面的介绍,以期尽可能的将更多的Criteria强大的查询功能展现出来; 1、首先新建一个Maven Web Project项目,

yu102655的专栏 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Hibernate的Criteria 的用法总结

Hibernate的Criteria 的用法进行总结: <br />   Java代码 <br />Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。    <br />   Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的;而 DetachedCriteria

chssheng2007的专栏 4379

Hibernate之Criteria

1,Criteria Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。 2,DetachedCriteria Spring 的框架提供了getHibernateTemplate ().findByCriteria(detachedCriteri...

dianti5444的博客 97
上一篇: javascript操作dom 建立 增加 删除 克隆 访问节点
下一篇: 室内装修
sumer99
博客等级 码龄21年 10粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值