1、 一个界面有一组checkbox和一个“删除”按钮,“删除”按钮只在checkbox组中有checkbox被选中的情况下点击才有效。如何实现? 经过尝试, 现将代码记录如下:
//必须在选择了条目之后才可以删除
function ChkBox(myform){
n=document.all.chx.length;
var value="";
var flag=false;
for (i=0;i<n;i++){
if (document.all.chx[i].checked){
value=value + document.all.chx[i].value +",";
flag=true;
}
}
if(flag){
return window.location.href="deleteNews.action?paramValues="+value;
}
alert("请选择要删除的行");
return false;
}
//设置 “标志位”是一种非常有效的方式, 尤其是在进行逻辑分支选择的时候。
2、 spring的删除功能
知道spring对hibernate进行了封装, 也曾多次使用spring封装的查询操作, 不过使用"删除"还是第一次。使用this.getHibernateTemplate().delete()弹出三个方法, 但其中的参数都要求有object。这样子我先前设想的通过“delete from x where x.y=?”这样的方式就不行了。
————直接使用hibernate
public void deleteSelectNews(long relation_emailid) {
//由于spring只能删除对象,为了避免先查出对象再删除 直接使用hibernate
Session session = this.getHibernateTemplate().getSessionFactory().openSession();
try{
String hql = "delete XRelationEmail where relationId =?";
Transaction tx = session.beginTransaction();
tx.begin();
Query query = session.createQuery(hql);
query.setParameter(0, relation_emailid);
query.executeUpdate();
tx.commit();
}catch (Exception e) {
System.out.println("删除操作失败:dao层");
e.printStackTrace();
}finally{
session.close();
}
}
经测试, 删除成功。 但是假如删除的操作是处在spring的事物管理器中的话则还是得使用delete()这种方法。
如果要删除的为集合的话则可采取:
Collection<E>把所有查询结果entities 放进去,然后直接调用下面的方法
this.getHibernateTemplate().deleteAll(Collection)就是了
3、 今天尝试了一下如下的做法, 测试成功:
select * from x_relation_email where relation_id in (1,2,null); 也可以正确执行
等同于
select * from x_relation_email where relation_id in (1,2);
我之所以要做这样子的尝试是想让其具有“动态性”。 这种方式具有了一定的通用性,它的前提条件就是要能确定传进来的参数数组的长度, 如果长度也是不确定的那么这种方式仍然是不行的。
4、 异常: 6、 出现异常:
org.hibernate.QueryException: Expected positional parameter count: 1, actual parameters: [] [delete XRelationEmail where relationId =?]
后经自己排查, 发现原因:
忘记设置 query.setParameter(0, relation_emailid);