利用spring中this.getHibernateTemplate().execute()进行批量删除不成功,各位帮忙解决下?
本人用struts 2.1+spring2.5+hibernate 3.进行项目开发,需要批量删除数据,本想利用bulkUpdate方法的但是这个方法进行批量删除时用“?”表示的参数个数必须确定,所以采用this.getHibernateTemplate().execute()调用HibernateCallback()方法进行批量删除,POJO代码、DAO代码,请各位大虾指点。
数据表映射POJO类Admin源码如下:
- Java code
ackage per.ssh.dao.Admin;/** * Admin entity. @author MyEclipse Persistence Tools */public class Admin implements java.io.Serializable { // Fields private String adminUser; private String adminPwd; private Integer adminLevel; // Constructors /** default constructor */ public Admin() { } /** full constructor */ public Admin(String adminUser, String adminPwd, Integer adminLevel) { this.adminUser = adminUser; this.adminPwd = adminPwd; this.adminLevel = adminLevel; } // Property accessors public String getAdminUser() { return this.adminUser; } public void setAdminUser(String adminUser) { this.adminUser = adminUser; } public String getAdminPwd() { return this.adminPwd; } public void setAdminPwd(String adminPwd) { this.adminPwd = adminPwd; } public Integer getAdminLevel() { return this.adminLevel; } public void setAdminLevel(Integer adminLevel) { this.adminLevel = adminLevel; }}
.hbm.xml文档如下:
- XML code
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping> <class name="per.ssh.dao.Admin.Admin" table="admin" schema="dbo" catalog="mpr"> <id name="adminUser" type="java.lang.String"> <column name="admin_user" length="50" /> <generator class="assigned" /> </id> <property name="adminPwd" type="java.lang.String"> <column name="admin_pwd" length="50" not-null="true" /> </property> <property name="adminLevel" type="java.lang.Integer"> <column name="admin_level" not-null="true" /> </property> </class></hibernate-mapping>
DAO文件中的具体方法如下:
- Java code
public void deleteByIds(final Object[] ids)throws DAOException{ for(int i=0;i<ids.length;i++){ System.out.println(ids[i]); } final String queryString="delete Admin where adminUser in (:ids)"; try{ this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) { Query query = session.createQuery(queryString); query.setParameterList("ids", ids); return query.executeUpdate(); } }); } catch(Exception ex){ throw new DAOException(ex); } /*for(int i=0;i<ids.length;i++){ try{ Admin admin=(Admin)this.getHibernateTemplate().get(Admin.class,ids[i]); if(admin!=null){ this.getHibernateTemplate().delete(admin); } } catch(Exception ex){ throw new DAOException(ex); } }*/ }
Services的代码如下:
- Java code
public boolean deleteByIds(String ids) { // TODO Auto-generated method stub if(!ids.equals("")){ String[] IDs=ids.split(","); try{ adminDAO.deleteByIds(IDs); return true; } catch(DAOException ex){ ex.printStackTrace(); return false; } } else{ return false; } }
action中的方法如下:
- Java code
public String del(){ String ids=this.getParameter("ids"); boolean flag=adminService.deleteByIds(ids);//该service注入绝对没有错误,因为其他方法都能正确执行 if(flag){ this.addResult(SUCCESS,"数据删除成功!",null); } else{ this.addResult(ERROR,"删除数据出现异常!",null); } return SUCCESS; }
spring的applicationContext.xml配置文件如下:
- XML code
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"> </property> <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=mpr"> </property> <property name="username" value="sa"></property> <property name="password" value="tj@zjut09"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.SQLServerDialect </prop> </props> </property> <property name="mappingResources"> <list> <value>per/ssh/dao/Admin/Admin.hbm.xml</value> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean></beans>
我以前都是用这种批量删除方法的,都没有出现问题,这次却出现了问题不知道怎么回事?当然了,也可以通过我在DAO文件注释的那种方法进行删除,但是如果数据量过大的,就会重复多次的打开数据库效率太低了,请各位大虾帮忙检查。
[解决办法]
报错信息呢 ?
[解决办法]
为什么要 return query.executeUpdate();啊
[解决办法]
信息贴出来哦
[解决办法]
delete Admin where adminUser in (:ids)
delete后面不需要from?反正mysql里面是需要的,不知道sqlserver是什么情况。
[解决办法]
大批量操作,JDBC吧,简单直接,
hibernate只适合简单对象操作。
[解决办法]