0

Hibernate中Session类的“update”方法和Query类的“executeupdate”方法有什么区别,什么时候使用?

4

3 回答 3

2

这两种方法在不同的抽象级别上工作:

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

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

何时使用取决于您的需求,正如 bellabax 所说:executeUpdate对于更新特定表和几行很有用,但update如果我不处理严格的时间限制(发布多个数据库UPDATE会更慢),我更喜欢简单性。

于 2013-08-07T09:22:42.040 回答
0

简而言之:Session.update()用于更新单个映射实体;您可以执行Query.executeupdate()自定义删除/更新语句(编写为 HQL 或纯 SQL)并获得更新/删除的实体计数。
哪种方法正确取决于您的需要:executeupdate()您可以根据查询删除/更新任意数量的对象,一次update()只能更新一个对象。

于 2013-08-07T09:21:27.947 回答
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 会在事务注解中自动调用更新方法。这意味着上面的查询不仅是必要的,而且很危险,因为我们丢失了数据。

实际上, query.setDate(Date datetime) 不返回完整的日期+时间值,而是仅返回日期。

上面的代码可以很快写出来:

    @@Transactional(readOnly = false)
public void updateLastActivity(VaultUserImpl user, Date lastActivity) {
    user.setLastActivity(lastActivity);
}
于 2017-03-01T16:08:41.403 回答