日期:2014-05-20  浏览次数:20681 次

HQL语句,如何同时删除多行记录?
数据库为MYSQL 5
我是Hibernate的新手

想进行多条记录的删除,在MYSQL 5 中可以这样实现的语句

delete from channels where id in (1,2,3)

如何在Hibernate中用hql语句实现?

我试过这样:
public void deleteChannel(String channelID){
  String hql="DELETE Channels WHERE id in (?)";
  Query q = this.session.createQuery(hql);
  q.setString(0, channelID);
  q.executeUpdate();
  this.session.beginTransaction().commit();
}

deleteChannel("1,2,3")
但只能删除id为1的记录,不能实现三条记录全部删除!是不是我写错了??恳请各位帮帮我。


不好意思,我没有多少分可给。

------解决方案--------------------
事实上你的 channelID 是 int 类型的。
当你 把一个字符串 "1,2,3" 传入的时候.
你的hql 会被解析为:

delete from changels where id in ('1,2,3')
我也不晓得这样为什么会把 id 为1 的删除.

但是 hibernate 在批处理的时候是没有jdbc好的.
所以象这种逻辑一般直接用 createSQLQuery 处理比较好。

------解决方案--------------------
squallffx (squall) 在CSDN社区共有可用分:870, 已花费可用分:45, 剩余可用分:825

你有825分,竟然哭穷!


算了,建议你
1 逐个删除还了,而且hibernate支持批量删除,Batch 的!性能也很好!
2 使用NativeQuery 吧!

------解决方案--------------------
hibernate本身API去做批量删除更新都是不推荐的 或者用调存储过程的办法也是可行的
C# code

tx = session.beginTransaction();
Connection con=session.connection();

String procedure = "{call batchUpdateCustomer(?) }";
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); 
cstmt.executeUpdate();
tx.commit();

------解决方案--------------------
public void deleteChannel(Object... channelID){
if(channelID==null)return;
StringBuilder str=new StringBuilder( "delete from Channels wher id in (? ");
for(int i=1;i <channelID.length;i++){
str.append( ",? ");
}
str.append( ") ");
Query q = this.session.createQuery(hql);
for(int i=0;i <channelID.length;i++){
q.setString(i+1,channelID[i].toString());
}
q.executeUpdate();
this.session.beginTransaction().commit();
}