【问题标题】:HQL multiple updates. Is there a better way?HQL 多次更新。有没有更好的办法?
【发布时间】:2010-03-16 09:42:11
【问题描述】:

我有一张地图,我想坚持下去。域对象是这样的:

public class Settings {
    private String key;
    private String value;

    public String getKey() { ... }
    public String getValue() { ... }
    public void setKey(String key) { ... }
    public void setValue(String value) { ... }
}

标准的方法是为每一对生成一个Setting,并为它生成一个saveOrUpdate()。但是它会产生太多的查询,因为我需要一次保存很多设置,而且它确实会影响性能。有没有办法使用一个更新查询来做到这一点?

UPD: 好的,也许有一个用于更新多行的 hql 语法?类似的东西

update Settings s1 set s1.value = :value1 where s1.key = :key1
                s2 set s2.value = :value2 where s2.key = :key2

【问题讨论】:

  • 我知道这是一篇很老的帖子。但是您对此类查询使用了什么?我需要使用 JPA/Hibernate 运行完全相同的查询

标签: java hibernate hql


【解决方案1】:

如果每个设置都是表中的一行,则需要发出尽可能多的更新语句。但是有几件事要看

1) 将 hibernate 批处理大小调整为 20 左右,这意味着尽管 hibernate 发布了 20 个更新,但它们都作为批处理发送(希望一次网络往返提供驱动程序允许批处理)

2) 修改你的 dao 代码/事务逻辑以批量处理

3) 拥有存储过程并传递数组值(我认为hibernate和storedprocs不是好朋友)

【讨论】:

    【解决方案2】:

    我不知道有什么语法可以像你写的那样有多个 where 语句。

    确保您使用的是批处理。如果不尝试激活它的更新。

    如果您要用于更新设置表的值已经在数据库中的其他位置,您应该可以进行一次更新。那可能会更快。

    如果数据库中还没有数据,您可以在执行单个更新查询之前将它们插入到临时表中,但在这里,您将需要 sql 查询(这可以通过 hibernate 实现)。

    但是那个单一的更新语句可能仍然太慢。我知道的最后一个解决方案(没有完全重新考虑用例的逻辑)是“选择更新”语句。那是原始的jdbc,但是使用spring JdbcTemplate,它并没有那么痛苦。您选择要更新的所有行(如果它使请求更快,您可能会选择更多,但在这种情况下,您将对网络资源产生影响,从数据库中获取比需要更多的行),然后更新他们在获取它们时使用 jdbc。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多