【问题标题】:Hibernate Update Query issue休眠更新查询问题
【发布时间】:2013-01-21 07:46:41
【问题描述】:

对于本次更新查询

update TestDB.dbo.MyEmp set empname=? where empid=?

我在我的 DAO 课上写过

MyEmployee myEmployee = new MyEmployee();

MyEmployee myEmployee =(MyEmployee )session.load(MyEmployee.class, 
  new Integer(1700));
myEmployee.setName("updatedName"); 
session.update(myEmployee );

它工作正常,但我需要知道下面提到的这种类型的更新查询

update TestDB.dbo.MyEmp set empsalary=? where empid=? && empname = ?

(即,我需要在 where 子句中使用两个条件来更新表,这可以通过 HQL 完成,但我想知道我们如何使用 saveOrUpdate 方法来实现这一点..)

如何使用 update 或 saveOrUpdate 方法()进行更新? 在hibernate中是否可以这样做?

【问题讨论】:

    标签: java hibernate orm sql-update dao


    【解决方案1】:

    您必须先通过两种方式获取您的对象:

    1- HQL

    Query query = session.createQuery("from MyEmployee e where e.id = ? and e.name = ?");
    query.setParameter(0, 1);
    query.setParameter(1, "myName");
    MyEmployee e = (MyEmployee) query.uniqueResult();
    e.setSalary(5000);
    session.saveOrUpdate(e);
    

    2- 标准

    Criteria criteria = session.createCriteria(MyEmployee.class);
    criteria.add(Restrictionss.eq("id", 1)).add(Restrictions.eq("name", "myName");
    MyEmployee e = (MyEmployee) criteria.uniqueResult();
    e.setSalary(5000);
    session.saveOrUpdate(e);
    

    顺便说一下,在默认刷新模式下,当您获取对象并对其进行更新时,它将在会话结束时自动持久化(如果您不使用 StatelessSession)。

    【讨论】:

      【解决方案2】:

      Hibernate saveorupdate 将采用表实体,我的意思是 Pojo 类作为参数。Hibernate 将通过其主键即 id 识别表中的实体。

      因此,您无需在剩余参数上添加任何其他 where 子句 ..因为您已经决定保存实体,而不管其中的数据如何。

      如果你真的想检查其他参数,你必须在Saveorupdate之前在java中检查相同的参数。

      如果您决定保存整个对象数据然后只使用saveOrUpdate 其他明智的选择HQLCriterias 以获得更多Restrictions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多