在Criteria
中使用Hibernate
时是否可以执行更新?例如:
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();
答案 0 :(得分:10)
有一个非常强大的功能叫做:
...但是,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();
总结:有了这个:
答案 1 :(得分:5)
现在我们可以为批量更新和删除做类似的事情。针对criteriaUpdate和CriteriaDelete
发布了新的apiCriteriaBuilder 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();
答案 2 :(得分:1)
首先你应该得到对象然后修改和更新:
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);
如果您想使用部分/动态更新功能,请输入
@org.hibernate.annotations.Entity(
dynamicUpdate = true
)
在dao类之上的注释。
示例来自:http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/
注意:问题是&#34;标准&#34;但接受的答案不是&#34;标准&#34;但是SQL。