【问题标题】:hibernate update single column using criteria使用条件休眠更新单列
【发布时间】:2014-12-02 11:06:41
【问题描述】:

我有一个包含 mamy 列的表,我想在不影响其余列的情况下更新该行的一列或几列 我可以写查询:

update table as t set t.a=:a set t.b=:b where t.id=1

但是看到我不知道会选择更新哪些列,我认为为每个场景编写每个查询并不是一个好主意。好吧,我必须为每个场景编写查询,但我正在寻找一种更好的方法来动态更新表。我认为标准将是一个不错的选择。但问题是我不知道如何编写标准更新特定列。我的代码现在可以更新该列,但它会将其他列设置为 null 或空。

在不更改其他列的情况下更新特定列的好方法是什么?

【问题讨论】:

    标签: hibernate hibernate-criteria dml


    【解决方案1】:

    Hibernate 支持两种更新表列的基本方法。

    第一个是自然的,通过将实体加载到session,在运行时更改它,将更改刷新(udpate)回DB。这是标准,ORM 风格。

    第二个主要面向非常高效的SQL UPDATE语句。此处记录为:

    15.4. DML-style operations

    引用自文档:

    ...但是,Hibernate 提供了通过 Hibernate 查询语言执行的批量 SQL 样式 DML 语句执行的方法...

    它不提供用于条件查询的 API,但它可以与 HQL == 和我们的域模型一起使用。

    我们可以在我们的映射实体之上创建一个 WHERE 子句,并且只要求更新我们选择的几个列。 有一些限制(不支持 JOIN)但可以通过子查询来解决...

    这是来自 doc 的 sn-p:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    
    String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";
    // or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
    int updatedEntities = session.createQuery( hqlUpdate )
            .setString( "newName", newName )
            .setString( "oldName", oldName )
            .executeUpdate();
    tx.commit();
    session.close();
    

    另请查看此问答:Hibernate execute update with criteria

    【讨论】:

      【解决方案2】:

      使用 JPA,您可以这样做。

      CriteriaBuilder builder = session.getCriteriaBuilder();
      CriteriaUpdate<User> criteria = builder.createCriteriaUpdate(User.class);
      Root<User> root = criteria.from(User.class);
      criteria.set(root.get("fname"), user.getName());
      criteria.set(root.get("lname"), user.getlastName());
      criteria.where(builder.equal(root.get("id"), user.getId()));
      session.createQuery(criteria).executeUpdate();
      

      【讨论】:

        【解决方案3】:

        .setString( "newName", newName )-- 已弃用,新方法如下!

        int updatedEntities1 = session.createQuery( hqlUpdate )
                            .setParameter("column_name", value)
                            .executeUpdate();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-19
          • 2012-06-27
          • 2019-12-18
          • 1970-01-01
          • 1970-01-01
          • 2011-06-30
          • 1970-01-01
          相关资源
          最近更新 更多