hibernate使用条件更新单列

时间:2014-10-07 21:47:48

标签: hibernate hibernate-criteria dml

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

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

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

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

3 个答案:

答案 0 :(得分:11)

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

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

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

15.4. DML-style operations

来自doc:

引用

  

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

它没有为条件查询提供API,但它与我们的域模型的HQL ==一起使用。

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

这是doc:

的摘录
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();

同时查看此Q& Q:Hibernate execute update with criteria

答案 1 :(得分:4)

使用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();

答案 2 :(得分:0)

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

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