Session类的“update”方法和hibernate中Query类的“executeupdate”方法有什么区别,哪种方法使用?
答案 0 :(得分:2)
这两种方法在不同的抽象层次上起作用:
update 基本上使用它的参数实体,在其表中找到具有相同主键的行并发出UPDATE
,以便在提交事务后,该行包含您的参数对象具有的所有信息。此外,如果使用cascade = save-update
注释/标记更新,则更新将级联到所有相关对象。
executeUpdate 将解析您创建的查询(应该是UPDATE
或DELETE
语句)并将其发布到数据库。没有执行级联或其他逻辑。
何时使用,这取决于您的需求,正如bellabax所说:executeUpdate
对于更新特定的表和多行很有用,但如果我不使用,我更喜欢update
的简单性严重的时间限制(发出几个数据库UPDATE
会慢一些。)
答案 1 :(得分:0)
简而言之:Session.update()
用于更新单个映射实体;使用Query.executeupdate()
,您可以执行自定义删除/更新语句(编写为HQL或纯SQL)并获取更新/删除的实体计数结果。
哪个是正确的方法取决于您的需要:使用executeupdate()
,您可以根据查询删除/更新任意数量的对象,update()
您只能更新一个对象。
答案 2 :(得分:0)
executeUpdate允许您运行Hibernate不支持的本机SQL查询。例如,您需要使用某些条件进行更新。
使用executeUpdate功能更强大,但不要在Hibernate事务中使用它。给出如下方法:
@@Transactional(readOnly = false)
public void updateLastActivity(VaultUserImpl user, Date lastActivity) {
Query query = getCurrentSession().createQuery("UPDATE VaultUserImpl user set user.lastActivity=:lastActivity where user.id=:id");
query.setDate("lastActivity", lastActivity);
query.setLong("id", user.getId());
query.executeUpdate();
user.setLastActivity(lastActivity);
}
默认情况下,Hibernate会在事务注释中自动调用update方法。这意味着上面的查询不仅是必要的,而且是dangereux,因为我们丢失了数据。
实际上,query.setDate(Date datetime)不会返回完整日期+时间值,只会返回日期。
上面的代码可以写一下:
@@Transactional(readOnly = false)
public void updateLastActivity(VaultUserImpl user, Date lastActivity) {
user.setLastActivity(lastActivity);
}