Hibernate使用条件执行更新
在Hibernate
使用Criteria
是否可以执行更新? 例如:
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();
有一个非常强大的function叫做:
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();
摘要:有了这个:
- 我们可以使用查询来过滤结果
- 我们可以对其应用批量更新
- 我们不需要在内存中加载这些行到会话中……
现在我们可以做这样的事情进行批量更新和删除。 为criteriaUpdate和CriteriaDelete发布了新的api
CriteriaBuilder cb = this.em.getCriteriaBuilder(); // create update CriteriaUpdate 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();
首先你应该得到对象,然后修改和更新:
Query q = session.createQuery("from StockTransaction where tranId = :tranId "); q.setParameter("tranId", 11); StockTransaction stockTran = (StockTransaction)q.list().get(0); stockTran.setVolume(4000000L); session.update(stockTran);
如果你想使用部分/动态更新function然后放
@org.hibernate.annotations.Entity( dynamicUpdate = true )
dao类顶部的注释。
示例来自: http : //www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/
注意:问题是“有标准”但接受的答案不是“有标准”而是SQL。
- 如何使用Spring清除所有Hibernate缓存(ehcache)?
- 如何防止Hibernate删除JSONpost中不存在的子对象?
- 在Hibernate上更新分离对象的某些字段的最佳方法?
- API或代码:Hibernate 3和4之间的区别?
- org.hibernate.StaleStateException:批量更新从update 返回意外的行数; 实际行数:0; 预期:1
- 在数据库模式中hibernate二级缓存和ON DELETE CASCADE
- 使用EntityManager从EJB访问Hibernate会话
- 基本hibernate选择所有语法
- ‘field list’gwt项目中的未知列’… jdoDetachedState’