Session类的“update”方法与hibernate中Query类的“executeupdate”方法有什么区别,哪种方法使用?

时间:2013-08-07 09:06:49

标签: java sql hibernate

Session类的“update”方法和hibernate中Query类的“executeupdate”方法有什么区别,哪种方法使用?

3 个答案:

答案 0 :(得分:2)

这两种方法在不同的抽象层次上起作用:

  • update 基本上使用它的参数实体,在其表中找到具有相同主键的行并发出UPDATE,以便在提交事务后,该行包含您的参数对象具有的所有信息。此外,如果使用cascade = save-update注释/标记更新,则更新将级联到所有相关对象。

  • executeUpdate 将解析您创建的查询(应该是UPDATEDELETE语句)并将其发布到数据库。没有执行级联或其他逻辑。

何时使用,这取决于您的需求,正如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);
}