本人用struts 2.1+spring2.5+hibernate 3.进行项目开发,需要批量删除数据,本想利用bulkUpdate方法的但是这个方法进行批量删除时用“?”表示的参数个数必须确定,所以采用this.getHibernateTemplate().execute()调用HibernateCallback()方法进行批量删除,POJO代码、DAO代码,请各位大虾指点。
数据表映射POJO类Admin源码如下: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 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文件中的具体方法如下: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的代码如下:
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中的方法如下: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 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文件注释的那种方法进行删除,但是如果数据量过大的,就会重复多次的打开数据库效率太低了,请各位大虾帮忙检查。

解决方案 »

  1.   

    没出现报错信息,反正就是删除不了,我用断点,程序执行到创建Query对象处就不执行了,不知道怎么回事,那条queryString我没有写错啊,不知道问题在哪?
      

  2.   

    为什么要 return query.executeUpdate();啊
      

  3.   

    因为使用了HibernateCallback对象,他的方法要求是要返回一个object的,当然把影响的行数返回去咯,或者返个空也行的
      

  4.   

    delete Admin where adminUser in (:ids)delete后面不需要from嗎?反正mysql里面是需要的,不知道sqlserver是什么情况。
      

  5.   

    我使用的是HQL语句,它的delete语句就是这样写的
      

  6.   

    大批量操作,JDBC吧,简单直接,
    hibernate只适合简单对象操作。
      

  7.   

    问题解决了,原因是antlr-2.7.6.jar和anltr-2.7.2.jar这两个包冲突,把struts2.0中antlr-2.7.2.jar删除即可采用我所使用的那种批量删除方式,以后还是用原生包算了,用myeclipse自带的包太容易冲突了!