Hibernate使用条件执行更新

vli*_*o20 11 java sql orm hibernate

是否有可能同时使用执行更新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();
Run Code Online (Sandbox Code Playgroud)

Rad*_*ler 11

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

15.4.DML风格的操作

来自doc的小小的引用:

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

所以,虽然这不是关于criteria- 我们仍然可以使用我们的域模型进行查询,因为它是关于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();
Run Code Online (Sandbox Code Playgroud)

摘要:有了这个:

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


Pay*_*sal 6

现在我们可以做这样的事情进行批量更新和删除.为criteriaUpdate和CriteriaDelete发布了新的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();
Run Code Online (Sandbox Code Playgroud)