hibernate批量删除和更新数据

转载自:http://blog.csdn.net/yuhua3272004/article/details/2909538

Hibernate3.0 採用新的基于ANTLR的HQL/SQL查询翻译器,在Hibernate的配置文件里,hibernate.query.factory_class属性用来选择查询翻译器。

(1)选择Hibernate3.0的查询翻译器:

hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory

(2)选择Hibernate2.1的查询翻译器

hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory

为了使用3.0的批量更新和删除功能,仅仅能选择(1)否则不能解释批量更新的语句。选择(2)但没法解释批量更新语句了。

大批量更新/删除(Bulk update/delete)

就像已经讨论的那样,自己主动和透明的 对象/关系 映射(object/relational mapping)关注于管理对象的状态。 这就意味着对象的状态存在于内存,因此直接更新或者删除 (使用 SQL 语句 UPDATE 和 DELETE) 数据库中的数据将不会影响内存中的对象状态和对象数据。 只是,Hibernate提供通过Hibernate查询语言来运行大批 量SQL风格的(UPDATE)和(DELETE) 语句的方法。

UPDATE 和 DELETE语句的语法为: ( UPDATE | DELETE ) FROM? ClassName (WHERE WHERE_CONDITIONS)?。 有几点说明:

在FROM子句(from-clause)中,FROMkeyword是可选的

在FROM子句(from-clause)中仅仅能有一个类名,而且它不能有别名

不能在大批量HQL语句中使用连接(显式或者隐式的都不行)。只是在WHERE子句中能够使用子查询。

整个WHERE子句是可选的。

举个样例,使用Query.executeUpdate()方法运行一个HQL UPDATE语句:

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

String hqlUpdate = "update Customer set name = :newName where name = :oldName";

int updatedEntities = s.createQuery( hqlUpdate ) .setString( "newName", newName ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit();

session.close();

运行一个HQL DELETE,相同使用 Query.executeUpdate() 方法 (此方法是为 那些熟悉JDBC PreparedStatement.executeUpdate() 的人们而设定的)

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

String hqlDelete = "delete Customer where name = :oldName";

int deletedEntities = s.createQuery( hqlDelete ) .setString( "oldName", oldName ) .executeUpdate();

tx.commit();

session.close();

由Query.executeUpdate()方法返回的整型值表明了受此操作影响的记录数量。 注意这个数值可能与数据库中被(最后一条SQL语句)影响了的“行”数有关,也可能没有。一个大批量HQL操作可能导致多条实际的SQL语句被运行, 举个样例,对joined-subclass映射方式的类进行的此类操作。这个返回值代表了实际被语句影响了的记录数量。在那个joined-subclass的样例中, 对一个子类的删除实际上可能不只会删除子类映射到的表并且会影响“根”表,还有可能影响与之有继承关系的joined-subclass映射方式的子类的表。

------------------------------------------------------------------------------------------------

我在 spring + hibernate 中 使用

String sql = "delete PlanPackageRelations  where ppfId = "+ppfId;

int a = this.getHibernateTemplate().getSessionFactory().openSession().createQuery(sql).executeUpdate();

结果控制台输出一下信息:

在本地事务包括边界中使用的资源 jdbc/cnas 的可分享连接 MCWrapper id 19911991  Managed connection[email protected] State:STATE_TRAN_WRAPPER_INUSE

-------------------------------------------------------------------------------------------------

调用jdbc 处理依据非主键删除。

/**

* 依据ppfId ,删除PlanPackageRelations。

* @param ppfId

*/

public  void deletePlanPackageRelations(String ppfId){

final String ppfIdFinal = ppfId;

try {

this.getHibernateTemplate().execute(new HibernateCallback(){

public Object doInHibernate(Session session) throws HibernateException, SQLException {

List result = new ArrayList();

String sql = "delete PlanPackageRelations  where ppfId = :ppfId";

Query query = session.createQuery(sql).setString("ppfId",ppfIdFinal);

result.add(new Integer(query.executeUpdate()));

return result;

}

});

//         String sql = "delete PlanPackageRelations  where ppfId = "+ppfId;

//         int a = this.getHibernateTemplate().getSessionFactory().openSession().createQuery(sql).executeUpdate();

//

}catch(DataAccessException t){

t.printStackTrace();

throw t;

}catch (Exception e) {

e.printStackTrace();

}

}

--------------------------------------------------------------------------------------------

使用HibernateTemplate批量删除数据

使用spring + hibernate框架中,一般使用hibernateTemplate来使用Hibernate,但hibernateTemplate

的 bulkUpdate()不能实现动态的批量删除,即使用bulkUplate时要事先确定下占位符”?“的个数,然后再使用其重载方法 bulkUpdate(queryString, Object[]),此时,Object[]内的元素个数就要跟queryString中的占位符“?”的个数相等,使用十分麻烦,因此能够使用 HibernateCallback回调函数来进行动态批量删除,即能够不考虑要删除元素的个数。详细用法例如以下例:

public void bulkDelete(final Object[] ids) throws Exception {

final String queryString = "delete PersistentModel where id in (:ids) ";

super.execute(new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException, SQLException {

Query query = session.createQuery(queryString);

query.setParameterList("ids", ids);

return query.executeUpdate();

}

});

}

注:标红处的占位符要加上(),否则会抛出语法错误异常。

-----------------------------------------------------------------------------------------

bulkUpdate 使用:

String updateSql = "update Rsceref ref set ref.rulecode = ? where ref.rscerefcode = ?";

getHibernateTemplate().bulkUpdate(updateSql, new Object[]{chkObj.getBmcrcode(),listExistRuleSql.get(0)});

this.getHibernateTemplate().bulkUpdate(sql);

时间: 2024-10-14 22:55:14

hibernate批量删除和更新数据的相关文章

Java批量插入、更新数据

Java的批量添加数据,多个字段同时添加多条数据,我不知道你遇到过没有.今天我们就以一个具体的实例来说一下Java的批量添加数据,面向的是Oracle数据库. 前台页面: <span style="font-size:14px;"><body class="main_body" scroll="no"> <div class="employee_gun_dong"> <form nam

如何通过PhpMyAdmin批量删除MYSQL数据库数据表

使用这个方法前,强烈建议先备份整个数据库.至于怎么备份?你不会么?在本文下方留言吧. 具体方法:复制下面的php执行语句,保存为sql.php文件(注意配置数据库名称.密码.数据表头),通过ftp上传到网站跟目录,运行. <?php //设置数据库连接信息.数据库服务器地址,数据库用户名,数据密码 mysql_connect('localhost','root','123456'); //设置查询的数据库名称,比如CMSYOU当前设置的是phpcms mysql_select_db('phpcm

hibernate 级联删除报更新失败的问题(org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update)

首先hibernate级联删除的前提是,首先需要在映射文件中配置,配置多表之间的关联关系: 下面以部门表(Dept)和员工表(Emp)为例: 1.在Emp.hbm.xml映射文件中配置many-to-one关系 1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http:/

批量插入或更新数据

/// <summary>        /// 大数据单表批量插入,带事务        /// </summary>        /// <param name="keepID"></param>        /// <param name="tableName"></param>        /// <param name="dt"></para

Hibernate批量删除的两种方式

第一种:使用Hibernate映射类对对象进行封装操作 --------------------------------------------------------------------------- @Override    public boolean deleteTrainee(long[] id) {        try {            Session session = HibernateSessionFactory.getSession();            

批量删除Sql Server数据表

最近做数据转移,由于误操作,在系统表master表里创建了N多表   实在是没法删 找到以下方法共享一下 --指定要删除的数据库中的表 use master go declare @sql varchar(8000),@TableName varchar(100) begin declare cur cursor for select Name from sysobjects where xtype='p' and crdate>='2015-03-31 10:33:14.663' open c

Mysql游标使用 批量插入或更新数据

-- LOOP循环 CREATE PROCEDURE `test`.`new_procedure` () BEGIN -- 需要定义接收游标数据的变量 DECLARE a CHAR(16); -- 游标 DECLARE cur CURSOR FOR SELECT i FROM test.t; -- 遍历数据结束标志 DECLARE done INT DEFAULT FALSE; -- 将结束标志绑定到游标 DECLARE CONTINUE HANDLER FOR NOT FOUND SET do

2019/1/15 批量删除数据库相关数据

目的:删除数据库各个系统his库里的测试soe与故障数据:一.sql执行错误:执行sql:SELECT FROM SOE WHERE sDevCode = 012400000001报错:[SQL Server]将 varchar 转换为数据类型 numeric 时出现算术溢出错误.原因:查看表设计,sDevCode列的类型为varchar(字符串),修改:SELECT FROM SOE WHERE sDevCode = '012400000001' .二.脚本: -- coding:UTF-8

hibernate批量更新和删除数据

批量处理  不建议用Hibernate,它的insert效率实在不搞,不过最新版本的Hibernate似乎已经在批量处理的时候做过优化了,设置一些参数如batch_size,不过性能我没有测试过,听说是这样.我记得以前在做大批量数据转移的时候我们测试过Hibernate,很慢,直接Pass,当时我们的系统由于用多个数据库,所以用的jdbc,如果不考虑移植还是可以用存储过程的. 存储过程对数据库依赖过强,不便系统移植   浅析Hibernate下数据批量处理方法 关键字: hibernate指处理