HQL多次更新。有没有更好的办法?

时间:2010-03-16 09:42:12

标签: java hibernate hql

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

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()生成update Settings s1 set s1.value = :value1 where s1.key = :key1 s2 set s2.value = :value2 where s2.key = :key2 。但是它会产生太多的查询,因为我需要一次保存大量设置,这确实会影响性能。有没有办法使用一个更新查询来执行此操作?

UPD:好吧,也许有更新多行的hql语法?像

这样的东西
{{1}}

2 个答案:

答案 0 :(得分:1)

如果每个设置都是表中的一行,则需要发出尽可能多的更新语句。但是要注意的一些事情是

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

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

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

答案 1 :(得分:0)

我不知道任何允许多个where语句的语法,就像你写的那样。

确保您正在使用批处理。如果没有激活,请尝试更新。

如果要用于更新“设置”表的值已在其他位置的数据库中,则应该能够执行单个更新。那可能会更快。

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

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