博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DML风格的批量更新/删除
阅读量:6226 次
发布时间:2019-06-21

本文共 1734 字,大约阅读时间需要 5 分钟。

Hibernate提供的HQL语句也支持批量的UPDATEDELETE语法。

批量UPDATE DELETE语句的语法格式如下:

 
  1. UPDATE | DELETE FROM? <ClassName>  [WHERE WHERE_CONDITIONS] 

关于上面的语法格式有如下4点值得注意:

Ø  FROM子句中,FROM关键字是可选的,即完全可以不写FROM关键字。

Ø  FROM子句中只能有一个类名,该类名不能有别名。

Ø  不能在批量HQL语句中使用连接,显式或者隐式的都不行。但可以在WHERE子句中使用子查询。

Ø  整个WHERE子句是可选的。WHERE子句的语法和HQL语句中WHERE子句的语法完全相同。

假设对于上面需要批量更改User类实例的name属性,可以采用如下代码片段完成。

程序清单:codes\06\6.3\batchUpdate2\src\lee\UserManager.java

 
  1. private void updateUsers()throws Exception  
  2. {  
  3.     //打开Session  
  4.     Session session = HibernateUtil.currentSession();  
  5.     //开始事务  
  6.     Transaction tx = session.beginTransaction();  
  7.     //定义批量更新的HQL语句  
  8.     String hqlUpdate = "update User set name = :newName";  
  9.     //执行更新  
  10.     int updatedEntities = session.createQuery( hqlUpdate )  
  11.         .setString( "newName""新名字" )  
  12.         .executeUpdate();  
  13.     //提交事务  
  14.     tx.commit();  
  15.     HibernateUtil.closeSession();  
  16. }  

从上面的代码中可以看出,这种语法非常类似于PreparedStatementexecuteUpdate()语法,实际上,HQL的这种批量更新就是直接借鉴了SQL语法的UPDATE语句。

注意:

使用这种批量更新语法时,通常只需要执行一次SQLUPDATE语句,就可以完成所有满足条件记录的更新。但也可能需要执行多条UPDATE语句,这是因为有继承映射等特殊情况,例如有一个Person实例,它有Customer子类实例。当批量更新Person实例时,也需要更新Customer实例。如果采用joined-subclassunion-subclass映射策略时,PersonCustomer实例保存在不同的表中,因此可能需要多条UPDATE语句。

执行一个HQL DELETE,同样使用 Query.executeUpdate() 方法,下面是一次删除上面全部记录的代码片段。

程序清单:codes\06\6.3\batchDelete\src\lee\UserManager.java

 
  1. private void deleteUsers()throws Exception  
  2. {  
  3.     //打开Session  
  4.     Session session = HibernateUtil.currentSession();  
  5.     //开始事务  
  6.     Transaction tx = session.beginTransaction();  
  7.     //定义批量删除的HQL语句  
  8.     String hqlDelete = "delete User";  
  9.     //执行删除  
  10.     int deletedEntities = session.createQuery( hqlDelete )  
  11.         .executeUpdate();  
  12.     //提交事务  
  13.     tx.commit();  
  14.     HibernateUtil.closeSession();  
  15. }  

Query.executeUpdate()方法返回一个整型值,该值是受此操作影响的记录数量。我们知道,Hibernate的底层操作实际上是由JDBC完成的,因此,如果有批量UPDATEDELETE操作被转换成多条UPDATEDELETE语句,该方法将只能返回最后一条SQL语句影响的记录行数。

转载地址:http://jsuna.baihongyu.com/

你可能感兴趣的文章
挑战JavaScript正则表达式每日两题(1)
查看>>
WCF分布式开发常见错误(29):未识别的属性'targetFramework'
查看>>
Symfony2博客应用程序教程:第四部分-安全介绍
查看>>
python中if __name__ == "__main__"的解释
查看>>
《开源运营技术精髓》之负载均衡-1.2
查看>>
实践对网络安全建设思路的修正---“花瓶”模型V2.0
查看>>
如何为Linux安装Go语言
查看>>
Azure PowerShell (8) 使用PowerShell设置Azure负载均衡器规则
查看>>
lcd ram/半反穿技术解析【转】
查看>>
BSD vi/vim 命令大全(下)[转]
查看>>
EditText的属性介绍
查看>>
Unity3d dll 热更新 基础框架
查看>>
【Java开发技术之程序测试】Junit4 新功能学习总结
查看>>
接触C# 反射
查看>>
c#中const、static、readonly的区别
查看>>
在 Silverlight 项目中获取程序集的引用信息
查看>>
函数式编程(3) 幻灯片
查看>>
总结c#和javascript中常见的相关的"空"
查看>>
用DirectX实现粒子系统(二)
查看>>
六个人如何运维一万台服务器?
查看>>