笔记:Hibernate DML
Hibernate 提供的HQL(Hibernate Query Language)语句也支持批量 update 和 delete 语法,语法格式如下:
[UPDATE | DELETE] FROM <ClassName> [WHERE conditions]
关于上面的语法格式有以下需要值得注意的:
- 在 FROM子句中,FROM 关键字是可选的,可以不写 FROM 关键字
- 在 FROM 子句中,只能有一个类名,可以在该类名后指定别名
- 不能在批量HQL语句中使用连接,显式或者隐式的都不行,但可以在 WHERE 子句中使用子查询
- 整个 WHERE 子句是可选的
要使用HQL查询,使用HQL查询按如下步骤进行:
- 获取 Hibernate Session 对象
- 编写HQL语句
- 以HQL语句做为参数,调用Session的 createQuery 方法创建查询对象
- 如果HQL语句包含参数,这调用 Query 对象的 SetXxx() 方法为参数赋值
- 调用Query 对象的 list()、uniqueResult()、executeUpdate() 等方法返回查询结果或更新结果
代码片段如下:
public static void main(String[] args) {
Session curSession = hibernateUtils.openSession();
Transaction curTransaction = null;
Calendar calendar = Calendar.getInstance(Locale.CHINA);
try {
String updateStatement = "Update TransitRecordModel Set totalTradeAmt = totalTradeAmt + :plusVal where recordID > 2600 AND recordID < 2700";
curTransaction = curSession.beginTransaction();
int updateEntities = curSession.createQuery(updateStatement).setInteger("plusVal", 2).executeUpdate();
curTransaction.commit();
System.out.println("Update 成功,更新记录行 " + updateEntities);
} finally {
if (curSession != null) {
curSession.close();
}
}
}
- 关联和连接,当程序需要从多个表中取得数据时,SQL语句将会考虑使用多表连接查询,Hibernate 使用关联映射来处理底层数据表之间的连接,HQL 支持两种关联连接(join)形式:隐式(implicit)与显示(explicit)
- 隐式关联:隐式连接不使用 join 关键字,使用英文点号(.)来隐式连接关联实体(Hinbernate 3.2.2 版本之前支持),而Hibernate底层将自动进行关联查询,示例:
SELECT t From TransitRecordModel t where t.details.tradeAmt > :tradeAmt
- 显示关联:使用显示连接时可以为相关联的实体,甚至关联集合中的全部元素指定一个别名,HQL 连接类型直接借鉴了了SQL99多表查询的关键字,可以使用如下连接方式:
- inner join(内连接),可简写为 join,示例如下:
SELECT Distinct trm FROM TransitRecordModel trm inner join trm.details d where d.tradeAmt > 25
- left outer join(左外连接),可简写为 left join
- right outer join(右外连接),可简写为 right join
- full join(全连接)
- 对于有集合的属性的,Hibernate将默认采用延迟加载策略,如果需要改变该策略,可以在持久化注解中指定 fetch=FetchType.EAGER,或者在关联查询时增加 fetch 关键字,示例如下:
SELECT Distinct trm FROM TransitRecordModel trm inner join fetch trm.details d where d.tradeAmt > 25
- fetch 关键字不应该与 setMaxResults()或者setFirstResult()共用
- fetch不能与独立的with条件一起使用
- full join fetch 和 right join fetch 是没有任何意义
- 投影、聚合和分組,实际上是一种基于列的运算,通常用于投影到指定列(也就是过滤其他列,类似与 select 子句的作用),还可以完成SQL语句中常用的分组、组筛选等功能,Hibernate 的条件过滤中使用 Projection 代码投影运算,一旦产生 Projection 对象后,就可以通过 Criteria 提供的 setProejction 方法来进行投影运算,每个 Criteria 只能接受一个投影运算,因此如果要进行多个投影运算,则可以使用 Projection.ProjectionList 类来提供,该类是 Projection的子类,示例如下:
list = curSession.createCriteria(TransitRecordModel.class)
.setProjection(Projections.projectionList()
.add(Projections.rowCount())
.add(Projections.avg("totalTradeAmt"))
.addOrder(Order.desc("createTime")).list();
for (Object obj : list) {
Object[] ele = (Object[]) obj;
System.out.println("RowCount=" + ele[0] + "\tTotalTradeAmt=" + ele[1]);
}
System.out.println("查询完成,查询共计 " + list.size() + " 行记录");
- 离线查询和子查询,条件查询的离线查询由 DetachedCriteria 来代表,允许在一个Session范围之外创建一个查询,并且可以使用任务的Session来执行他,示例如下:
// 创建离线查询对象
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(TransitRecordModel.class);
detachedCriteria.setProjection(Property.forName("totalTradeAmt"));
// 在指定的 Session 中查询
list = detachedCriteria.getExecutableCriteria(curSession).list();
System.out.println("TotalTradeAmt=" + obj);
笔记:Hibernate DML的更多相关文章
- Hibernate学习笔记-Hibernate关系映射
1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- [ 学习笔记 ] Hibernate框架学习之一
一.JavaEE开发三层结构和三大框架的对应关系: Struts2框架 -> 表现层 web层(MVC是表现层的设计模型) 业务层 service层 Hibernate框架 -> 持久层 ...
- Hibernate笔记——Hibernate介绍和初次环境配置
Hibernate简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate ...
- Hibernate学习笔记--Hibernate框架错误集合及解决
错误1:MappingException: Unknown entity解决方案 http://jingyan.baidu.com/article/e75aca8552761b142edac6cf.h ...
- Hibernate笔记②--hibernate类生成表、id生成策略、级联设置、继承映射
一.多表的一个关联关系 老师和学生是一对多的关系 student:tid属性 外键约束 对应teacher表中的id属性 teacher:id 在myeclipse的db窗口中选中两个表来生成类. ...
- MySQL学习笔记2——DML
DML(数据操作语言,它是对表记录的操作(增,删,改)!) 1.插入数据 *INSERT INTO 表名(列名1,列名2,...) VALUES(列值1,列值2,...); >在表名后给出要插入 ...
- [学习笔记] Hibernate 4.3.5 下载与安装
下载 http://hibernate.org/orm/releases/4.3/ https://sourceforge.net/projects/hibernate/files/hibernate ...
- MySQL笔记总结-DML语言
DML语言 插入 一.方式一 语法: insert into 表名(字段名,...) values(值,...); 特点: 1.要求值的类型和字段的类型要一致或兼容 2.字段的个数和顺序不一定与原始表 ...
随机推荐
- csrf
什么是CSRF: CSRF(Cross-site request forgery),中文名称:跨站请求伪造 攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件,发 ...
- JVM 指令
1.Demo 2.Class 文件说明 2.1 Class文件结构 2.2 jvm type, method signature 2.3 泛型表示 3.方法说明 3.1 方法结构 3.1.1 Thre ...
- 重温.NET下Assembly的加载过程
最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没能解决我的问题,有些点写的不是特别详 ...
- R语言︱数据规范化、归一化
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:规范化主要是因为数据受着单位的影响较 ...
- 图解MBR分区无损转换GPT分区+UEFI引导安装WIN8.1
确定你的主板支持UEFI引导.1,前期准备,WIN8.1原版系统一份(坛子里很多,自己下载个),U盘2个其中大于4G一个(最好 准备两个U盘)2,大家都知道WIN8系统只支持GPT分区,传统的MBR分 ...
- VMware vSphere学习整理
知识点整理 内存选择 一般来说,每个虚拟机需要的内存在1~4GB甚至更多,还要为VMware ESXi预留一部分内存 2个6核的2U服务器配置64GB内存,4个6核或8核心的4U服务器配置128GB或 ...
- OpenStack_I版 6.Neutron部署
Neutron是不能自己创建网络的,它需要借助插件才能创建虚拟网桥.网卡 依赖插件 配置ml2为核心插件 本次网络模型采用扁平化网络,不同的网络类型不同的配置,不同的使用方法 打开安全组功能 Linu ...
- UltraEdit 脚本 实现查找替换
UltraEdit中,要实现,脚本查找替换功能,按照下文中的做法稍作修改, 现象很奇怪,有时可以进行查找替换有时不能. http://blog.csdn.net/neareast/article/de ...
- Python基础__Python序列基本类型及其操作(1)
本节考虑的Python的一个中要的内置对象序列, 所谓的序列即一个有序对象的集合.这里的对象可以是数字.字符串等.根据功能的不同将序列分为字符串.列表.元组,本文将以下这几种对象做一些介绍. 一. 字 ...
- [Luogu2073]送花
题面 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花束,他不断地 ...