休眠使用条件执行更新

2022-09-03 18:36:58

是否可以在 中使用 时执行更新?例如:CriteriaHibernate

Session session = getSession();
Criteria crit = session.createCriteria(User.class);
crit.add(Restrictions.eq("token", sessionToken));

User user= new User();
Transaction tx = session.getTransaction();
try 
{
    tx.begin();
    session.updateWithCriteria(user, crit); //my imaginary function 
    tx.commit();
}
catch (Exception e) 
{
    e.printStackTrace();
    tx.rollback();
}

session.close();

答案 1

有一个非常强大的功能叫做:

15.4. DML 样式的操作

小引用自文档:

...但是,Hibernate 提供了通过 Hibernate Query Language 执行的批量 SQL 样式 DML 语句执行的方法。

因此,虽然这与标准无关 - 我们仍然可以使用我们的域模型进行查询,因为它是关于HQL的。这是一个显示功能的片段:

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 = s.createQuery( hqlUpdate )
        .setString( "newName", newName )
        .setString( "oldName", oldName )
        .executeUpdate();
tx.commit();
session.close();

总结:有了这个:

  • 我们可以使用查询来过滤结果
  • 我们可以对其应用批量更新
  • 我们不需要将这些行加载到内存中,加载到会话中...

答案 2

现在,我们可以对批量更新和删除执行类似操作。针对标准更新和标准删除发布了新的 API

CriteriaBuilder cb = this.em.getCriteriaBuilder();
// create update
CriteriaUpdate<Order> update = cb.createCriteriaUpdate(Order.class);
// set the root class
Root e = update.from(Order.class);
// set update and where clause
update.set("amount", newAmount);
update.where(cb.greaterThanOrEqualTo(e.get("amount"), oldAmount));
// perform update
this.em.createQuery(update).executeUpdate();

推荐