Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hibernate使用条件更新单个列_Hibernate_Hibernate Criteria_Dml - Fatal编程技术网

hibernate使用条件更新单个列

hibernate使用条件更新单个列,hibernate,hibernate-criteria,dml,Hibernate,Hibernate Criteria,Dml,我有一个包含许多列的表,我想在不影响其余列的情况下更新行中的一列或几列 我可以写查询: update table as t set t.a=:a set t.b=:b where t.id=1 但是我不知道要更新哪些列,我认为为每个场景编写每个查询不是一个好主意。嗯,我必须为每个场景编写查询,但我正在寻找一种更好的方法来动态更新表。我认为标准将是一个很好的选择。但问题是,我不知道如何编写特定于条件更新的列。我的代码现在可以更新该列,但它会将其他列设置为null或空 更新特定列而不更改其他列的好

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

update table as t set t.a=:a set t.b=:b where t.id=1
但是我不知道要更新哪些列,我认为为每个场景编写每个查询不是一个好主意。嗯,我必须为每个场景编写查询,但我正在寻找一种更好的方法来动态更新表。我认为标准将是一个很好的选择。但问题是,我不知道如何编写特定于条件更新的列。我的代码现在可以更新该列,但它会将其他列设置为null或空


更新特定列而不更改其他列的好方法是什么

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

第一种是自然的,通过将实体加载到
会话中,在运行时对其进行更改,将更改刷新(udpate)回DB。这是一种标准的ORM样式

第二个主要面向非常高效的SQL更新语句。此处记录如下:

引用文件:

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提供了通过Hibernate查询语言执行大容量SQL样式DML语句的方法

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

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

这是文档中的一个片段:

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:

使用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();
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaUpdate criteria=builder.createCriteriaUpdate(User.class);
Root=criteria.from(User.class);
criteria.set(root.get(“fname”)、user.getName();
criteria.set(root.get(“lname”),user.getlastName();
其中(builder.equal(root.get(“id”)、user.getId());
createQuery(条件).executeUpdate();
.setString(“newName”,newName)
--已弃用,新方法如下

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