DML风格的批量更新/删除

本文介绍如何利用Hibernate的HQL语句进行批量的UPDATE和DELETE操作,包括语法格式、注意事项及实现代码示例。

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语句影响的记录行数。

`cp: cannot stat '/home/dml0/samba/cypress_code_0730.tar.gz': No such file or directory` 错误表明 `cp` 命令在尝试访问指定的文件或目录时,发现该文件或目录并不存在。以下是一些可能的解决方法: ### 检查文件路径是否正确 仔细确认文件路径 `/home/dml0/samba/cypress_code_0730.tar.gz` 是否准确无误。可以使用 `ls` 命令来查看该目录下的文件列表,以验证文件是否存在: ```bash ls /home/dml0/samba/ ``` 如果文件确实存在,那么可能是文件名大小写问题或者路径中有拼写错误。 ### 检查文件是否被移动或删除 文件可能已经被移动到其他位置或者被删除。可以使用 `find` 命令在系统中搜索该文件: ```bash find / -name "cypress_code_0730.tar.gz" ``` 这会在整个系统中查找名为 `cypress_code_0730.tar.gz` 的文件,但可能会花费一些时间。 ### 检查目录权限 确保当前用户对 `/home/dml0/samba/` 目录有足够的权限来访问其中的文件。可以使用 `ls -l` 命令查看目录的权限: ```bash ls -l /home/dml0/samba/ ``` 如果权限不足,可以联系系统管理员或者使用 `chmod` 命令修改权限。 ### 确认文件是否在挂载的文件系统中 如果 `/home/dml0/samba/` 是挂载的文件系统,确保该文件系统已经正确挂载。可以使用 `df -h` 命令查看挂载的文件系统: ```bash df -h ``` 如果文件系统未挂载,可以使用 `mount` 命令进行挂载。 ### 示例代码 以下是一个完整的检查示例: ```bash # 检查文件是否存在 if [ -f /home/dml0/samba/cypress_code_0730.tar.gz ]; then echo "文件存在,可以进行复制操作。" cp /home/dml0/samba/cypress_code_0730.tar.gz /destination/path/ else echo "文件不存在,请检查路径或文件是否被移动/删除。" fi ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值