页面有一条数据被修改后传回后台(主键当然没被修改,隐藏在页面里。),需要通过hibernate保存这条数据。
注意:只更新部分字段,不是所有字段。如果原来不用orm工具,可以直接执行sql语句:update tab set f1=?,f2=? where id=?
现在用orm,则要将页面中的vo对象把修改后的属性赋给一个new出来的po对象,包括主键。
然后saveorupdate,orm生成的sql语句是更新了表的所有字段,因为它不知道你要更新哪些字段!(映射文件已设置动态更新dynamic update = true)换个方法,不new vo对象,根据页面传回的主键loadpo,然后再用vo赋值再saveorupdate,这样OK。可是这样等于多执行了一遍select语句,降低了效率。我知道要想让hibernate知道更新哪些字段必须要将po先变成持久态,可是变成持久态而又不能更新数据库的方法只有load,get,refresh等等。这些都会产生select语句。有没有办法让hibernate达到new的po对象根据主键更新数据库而仅执行update的办法?

解决方案 »

  1.   

    hql
    update USER(xx)value(xxx)where xxxx=xxxxx
      

  2.   

    谢谢楼上,是一个办法。
    还有没有不写hql的方法?
      

  3.   

    那就就接受要修改的字段和主键
    然后写sql update tab set username = ? ,pwd=? where id  = ?session.createSQLQuery(sql).setParameter(0,username 
    .setParameter(1,pwd)).setParameter(2,id)); 这样就可以了
      

  4.   


    少一句 .executeUpdate();呵呵
      

  5.   

    谢谢上面各位,虽然不是我真正想要的解决办法,不过也让我明白了必须load。