[原创]java WEB学习笔记92:Hibernate学习之路-- -QBC 检索和本地 SQL 检索:基本的QBC 查询,带 AND 和 OR 的QBC,统计查询,排序,分页
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.QBC 检索和本地 SQL 检索
1)QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口
2)本地SQL查询来完善HQL不能涵盖所有的查询特性:添加操作
2.QBC 的具体实践和相关API
1)基本的QBC 查询
@Test
public void testQBC(){
//1.创建一个Criteria 对象
Criteria criteria = session.createCriteria(Employee.class); //2.添加查询条件: 在QBC 中查询条件使用 Criteria 表示
//Criteria 可以通过 Restrictions 的静态方法得到
criteria.add(Restrictions.eq("email", "SKUMAR"));
criteria.add(Restrictions.gt("salary", 5000F)); //3.执行查询
Employee employee = (Employee) criteria.uniqueResult();
System.out.println(employee);
}
2)带 AND 和 OR 的QBC: Restrictions 封装了一个常用的逻辑运算,算术等
@Test
public void testQBC2(){
Criteria criteria = session.createCriteria(Employee.class); //1.AND :使用Conjunction 表示
//conjuntion 本身就是一个criteria 对象,且其中还可以添加Criteria 对象
Conjunction conjunction = Restrictions.conjunction();
conjunction.add(Restrictions.like("name", "a",MatchMode.ANYWHERE));
Department dept = new Department();
dept.setId(80);
conjunction.add(Restrictions.eq("dept", dept));
System.out.println(conjunction); //(name like %a% and dept=Department [id=80]) //2.OR
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(Restrictions.ge("salary", 6000F));
disjunction.add(Restrictions.isNotNull("email") ); System.out.println(disjunction);//(salary>=6000.0 or email is not null) //添加至 criteria
criteria.add(disjunction);
criteria.add(conjunction); //执行
criteria.list(); }
Hibernate:
select
this_.ID as ID1_1_1_,
this_.NAME as NAME2_1_1_,
this_.SALARY as SALARY3_1_1_,
this_.EMAIL as EMAIL4_1_1_,
this_.DEPT_ID as DEPT_ID5_1_1_,
department2_.ID as ID1_0_0_,
department2_.NAME as NAME2_0_0_
from
GG_EMPLOYEE this_
left outer join
GG_DEPARTMENT department2_
on this_.DEPT_ID=department2_.ID
where
(
this_.SALARY>=?
or this_.EMAIL is not null
)
and (
this_.NAME like ?
and this_.DEPT_ID=?
)
3)统计查询:Projections 封装了一些 sql的聚合函数
@Test
public void testQBC3(){
Criteria criteria = session.createCriteria(Employee.class); //统计查询:使用Projection 来表示 可以由Projections 静态方法得到
criteria.setProjection(Projections.max("salary"));
System.out.println(criteria.uniqueResult()); }
Hibernate:
select
max(this_.SALARY) as y0_
from
GG_EMPLOYEE this_
24000.0
4)排序,分页
@Test
public void testQBC4(){
Criteria criteria = session.createCriteria(Employee.class);
//1.添加排序
criteria.addOrder(Order.asc("salary"));
criteria.addOrder(Order.desc("email")); //2.添翻页方法
int pageSize = 5;
int pageNo = 3;
criteria.setFirstResult((pageNo -1 ) * pageSize)
.setMaxResults(pageSize)
.list(); }
Hibernate:
select
*
from
( select
row_.*,
rownum rownum_
from
( select
this_.ID as ID1_1_1_,
this_.NAME as NAME2_1_1_,
this_.SALARY as SALARY3_1_1_,
this_.EMAIL as EMAIL4_1_1_,
this_.DEPT_ID as DEPT_ID5_1_1_,
department2_.ID as ID1_0_0_,
department2_.NAME as NAME2_0_0_
from
GG_EMPLOYEE this_
left outer join
GG_DEPARTMENT department2_
on this_.DEPT_ID=department2_.ID
order by
this_.SALARY asc,
this_.EMAIL desc ) row_
where
rownum <= ?
)
where
rownum_ > ?
3.由于QBC 不支持插入操作,所以hibernate 支持使用原生的 sql 进行更新操作
@Test
public void testNaviteSQL(){
String sql = "INSERT INTO gg_department VALUES(?,?)";
Query query = session.createSQLQuery(sql); query.setInteger(0, 300)
.setString(1, "JASON")
.executeUpdate(); }
Hibernate:
INSERT
INTO
gg_department VALUES
(?,?)
4.QBC 支持删除操作
@Test
public void testUpdate(){
String hql = "DELETE FROM Department d WHERE d.id = :id";
session.createQuery(hql).setInteger("id", 280).executeUpdate();
}
Hibernate:
delete
from
GG_DEPARTMENT
where
ID=?
[原创]java WEB学习笔记92:Hibernate学习之路-- -QBC 检索和本地 SQL 检索:基本的QBC 查询,带 AND 和 OR 的QBC,统计查询,排序,分页的更多相关文章
- Hibernate之QBC检索和本地SQL检索
QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口 本地SQL查询来完善HQL ...
- Hibernate(十五):QBC检索、本地SQL检索和HQL删除
QBC检索 QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口. 1)通过Cr ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 学习笔记:CentOS7学习之十九:Linux网络管理技术
目录 学习笔记:CentOS7学习之十九:Linux网络管理技术 本文用于记录学习体会.心得,兼做笔记使用,方便以后复习总结.内容基本完全参考学神教育教材,图片大多取材自学神教育资料,在此非常感谢MK ...
- 学习笔记:CentOS7学习之二十:shell脚本的基础
目录 学习笔记:CentOS7学习之二十:shell脚本的基础 20.1 shell 基本语法 20.1.1 什么是shell? 20.1.2 编程语言分类 20.1.3 什么是shell脚本 20. ...
- HTML+CSS学习笔记 (6) - 开始学习CSS
HTML+CSS学习笔记 (6) - 开始学习CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏 ...
随机推荐
- 深入浅出 - Android系统移植与平台开发(九)- JNI介绍
作者:唐老师,华清远见嵌入式学院讲师. JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官 ...
- sql to_char 日期转换字符串
1.转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char() to_date() 作用将字符类型按一定格式转化为日期类型: 具体用法:to_date('2004-11 ...
- OpenERP在哪储存附件?
我们知道对OpenERP中的每个内部对象(比如:业务伙伴,采购订单,销售订单,发货单,等等)我们都可以添加任意的附件,如图片,文档,视频等.那么这些附件在OpenERP内部是如何管理的呢? 默认情况下 ...
- Oracle临时表
1概念理解 ORACLE系统的临时表常被用于存放系统操作的中间数据,由于对临时的任何操作都不产生redo(但会因为修改undo而产生redo),所以临时表的数据操作效率一般都比较高.常用的临时表主要有 ...
- C++对析构函数的误解(转)
C++析构前言 析构函数在什么时候会自动被调用,在什么时候需要手动来调用,真不好意思说偶学过C++…今日特此拨乱反正. C++析构误解正文 对象在构造的时候系统会分配内存资源,对一些数据成员进行初始化 ...
- NGUI事件监听之UIEventListener的使用
NGUI的事件绑定可以使用 UIButtonMessage 在一个游戏对象上添加Button Message组件: 在Button Message组件上添加要通知的游戏对象上所挂载的脚本的方法 Tar ...
- SPFA导读及介绍(转载)
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...
- 重新启动 Apache 以加载上面安装的模块
尽管Ubuntu 是一种新兴的Linux分支,但Ubuntu 组织却为Apache提供了丰富的支持软件,这些软件都可以从发行版的光盘获取,也可以从官方站点轻松下载.所以,Ubuntu非常适合作为Web ...
- Rearrange a string so that all same characters become d distance away
Given a string and a positive integer d. Some characters may be repeated in the given string. Rearra ...
- C#中ref和out的使用与区别
C#中ref关键字和out关键字所实现的功能差不多,都是指定一个形参按照引用传递而不是实参的副本传递.但是二者适用场景还是有些区别的:out适合用在需要retrun多个返回值的地方,而ref则适合用在 ...