使用hibernate进行批量更新和删除操作

转载 2006年05月23日 15:26:00
本文中的功能仅存在于hibernate3中。参考文件hibernate3源代码中的org.hibernate.test.hql包下的BulkManipulationTest.java。

在hibernate2中对于批量操作的处理方法是,查询得到所有符合条件的数据库数据的主键,然后对根据主键对每条数据进行操作。这样感觉既费时又费力。最新Hibernate3中提供批量更新操作功能。例如:
程序代码 程序代码

String hqlUpdate = “ Update user u “+
“ SET u.username=:newUsername, u.password=:newPassword ”+
“ Where u.username=:username and u.password=:password “;
Query query = session.createQuery(hqlUpdate);
query.setString("username",”hfm”);
query.setString("password",”1”);
query.setString("newUsername",”ps”);
query.setString("newPassword",”123”);
int num = query.executeUpate();
ts.commit();


程序代码 程序代码

String hqlDelete = “ Delete FROM user u “+
“ Where u.username=:username and u.password=:password “;
query.setString("username",”ps”);
query.setString("password",”123”);
int num = query.executeUpate();
ts.commit();


变量session的类型为org.hibernate.Session;ts的类行为为org.hibernate.Transaction;返回值num表示有几条数据被操作了。以上两段代码执行后在控制台中打出来的SQL分别是:

Hibernate: update CUSTOMER user0_ set user0_.USERNAME=?, user0_.PASSWORD=? where (user0_.USERNAME=? and user0_.PASSWORD=?)

Hibernate: delete from CUSTOMER user0_ where (user0_.USERNAME=? and user0_.PASSWORD=?)

以上是我认为比较好的方法。但是注意,产生的第二条语句不能在MySql中执行,但是hql仍然可以被编译成sql,不知道是我语法写错了还是bug?有谁了解可以给我mail:lippea@sohu.com。另外在参考文件BulkManipulationTest.java中有一个方法:

public QueryTranslatorImpl assertTranslation(String hql) throws QueryException, MappingException;

这个方法我不知道是干嘛的,但是我尝试了按照这种形式进行批量操作:
程序代码 程序代码

String hqlDelete = “ Delete FROM user u “+
“ Where u.username=:username and u.password=:password “;
Object[] objects = new Object[]{“hfm”,”1”}
Type[] types=new Type[]{(Type)Hibernate.STRING,(Type)Hibernate.STRING};
QueryParameters queryParas = new QueryParameters(types,objects);
QueryTranslatorFactory ast = new ASTQueryTranslatorFactory();
QueryTranslator newQueryTranslator =
ast.createQueryTranslator(hqlDelete, Collections.EMPTY_MAP,
(SessionFactoryImplementor)sf );
newQueryTranslator.compile( Collections.EMPTY_MAP, false );
int num = newQueryTranslator.executeUpdate(queryParas,
(SessionImplementor)session);

sf的类型为org.hibernate.SessionFactory,session的类型为org.hibernate.Session。使用这种方法的结果与上面那种方法的结果相同,但是在对hql中变量进行赋值很不方便,我也没发现这种方法有什么更广泛的用处。或许有别的方法赋值,或者其它用处?

相关文章推荐

Hibernate批处理操作优化 (批量插入、更新与删除)

我们每次保存的东西都会保存在Session缓存中,这就是Hibernate的一级缓存,如果我们一直循环执行save等操作,缓存里东西会越来越多,速度也就越来越慢,服务器一直在循环处理,自然也会增加负载...

Hibernate批处理操作优化 (批量插入、更新与删除)

问题描述 我开发的网站加了个新功能:需要在线上处理表数据的批量合并和更新,昨天下午发布上线,执行该功能后,服务器的load突然增高,变化曲线异常,SA教育了我一番,让我尽快处理,将CPU负载...

hibernate使用注解无法进行更新操作的解决方法

1.一般来说,在多对多的双向关联中,往往是修改频繁的一方放弃外键维护。但在实际运用时要灵活选择,如学生选课中,按照前边那个约定,应该是课程一方维护外键,但若程序中是按照学号查找一个学生选了哪些课,而不...

ListView长按Item显示CheckBox并进行批量删除操作

ListView应该是每个项目中必不可少的控件了,有的可以编辑的ListView中有批量删除的功能,还有的ListView可以手动调Item排序。下面的代码就是如何实现ListView(默认为无上下拉...

Java对数据库进行事务处理(批量删除操作)

记录Java对数据库进行事务处理(删除操作),在开始之前先来看下面这样的一个页面图:         上面这张图片显示的是从数据库中查询出的用户信息,信息中进行了分页处理,然后每行的前面提供了一个...

对表格进行批量操作如全选反选删除功能

Select All table{ border:#999 1px solid;

Dojo 1.6 最新官方教程: 如何使用dojo.query 进行DOM查询和批量操作

在本讲义中,我们将学到DOM的查询,以及如何使用dojo.query来方便的查找并操作DOM节点。难度:初学者  适用的Dojo 版本: 1.6作者: Bryan Forbes译者: feijia原文...

使用JdbcTemplate进行批量操作

spring.xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://ww...

使用oledb对数据库进行增删改查及批量插入操作

使用oledb操作数据库工具类,可使用泛型统一操作 using System; using System.Collections.Generic; using System.Data; ...
  • fyshk
  • fyshk
  • 2015-04-29 11:15
  • 1452

使用Redis的管道(Pipeline)进行批量操作

Redis管道技术简介Reids是一个cs模式的Tcp服务,类似于http的请求。 当客户端发送一个请求时,服务器处理之后会将结果通过响应报文返回给客户端 。 那么当需要发送多个请求时,难道每次都要...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)