public void delBook(String[] bookIds) throws Exception {
Session session = this.getSession();
Transaction ts = session.beginTransaction();
try {
StringBuffer hql = new StringBuffer();
hql.append("delete from Book as book where book.id in (:bookIds)");
Query query = session.createQuery(hql.toString());
query.setParameterList("bookIds", bookIds);
ts.commit();
} catch (Exception e) {
e.printStackTrace();
ts.rollback();
throw e;
} finally {
closeSession();
}
}
上面是我没怎么过脑子写的批量删除的一个dao层的实现,但是忽然发现好像没有这么写的!
第一个疑问是query这个对象是不是只能是更新的时候用,像我上面写的这样是不是根本不能起作用呢?可以可以像我上面的这样写呢?
第二个疑问是hibernate中我们拿到一个id数组去批量删除的时候一般都是怎么做的?难道都是用for循环遍历么?

解决方案 »

  1.   

    把参数String[] bookIds变成逗号分割的字符串,然后拼到hql,一句搞定。
      

  2.   

     = = 删除多个 我这里分为2种情况1是 程序选择 多个选定的ID ,比如购物车选择多个商品(FOR 查询后删除)
    2是 级联删除 比如我删商品类别可以设定XML里进行级联删除 对 关联商品类别的 ”商品“ 进行批量删除
      

  3.   

    你的第一个疑问,hibernate可以执行删除语句
    语法如下:
    Query query = session.createQuery(hql);
    query.executeUpdate();你的第二个疑问,没有这样写的,你有2种解决方案
    1,用for循环,一个个的删除
    2,拼sql,将String[]数组拼成如下形式
    ('a','b','c');
    一条sql可以搞定,相信你能理解我的意思建议用for循环,这样比较符合规范
      

  4.   

    query.executeUpdate();
    最后要调用 执行删除的方法对于传的数组 应该和 book.id 的类型对应
      

  5.   

    和楼主同样的疑问,难道只能用for去删吗?
      

  6.   


    ok.本来看你的回复感觉挺好,但是看到最后一句蒙了"建议用for循环,这样比较符合规范"
    普遍做法是用for循环批量删除么?不可能把,我要一次删几万条数据循环几万次是么?不可能啊,批量删除的正规做法肯定是用sql语句批量删啊
      

  7.   

    楼上好多人说了,少了一个
    query.executeUpdate();然后才是ts.commit();
      

  8.   

    这样写应该是可以的,但如果book里有集合,效率会很低。
      

  9.   

    SSH的吗?
    我记得HibernateTemplate有个删除多个的方法的。
    public void deleteAll(Collection entities)