2010-03-16 49 views
1

我有一张地图,我想坚持下去。域对象是这样的: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()它。但是它会产生太多的查询,因为我需要一次节省大量设置,并且它确实会影响性能。有没有办法使用一个更新查询来做到这一点?

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

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

我知道它的方式旧帖子。但是你对这种查询使用了什么?我需要使用JPA/Hibernate运行完全相同的查询 – 2013-07-11 21:36:41

回答

1

东西,如果每个设置在一个表中的一行,然后需要有发行尽可能多的更新语句。但有几件事要看

1)调整休眠批量大小说20左右,这意味着虽然休眠发出20次更新,他们都作为一批发送(希望一个网络往返旅行,提供驱动程序允许批量)

2)修改您的DAO代码/事务逻辑做事一批

3)有一个存储过程,传递数组值(休眠和storedprocs不是很好的朋友,我认为)

0

我不知道任何允许拥有多个where语句的语法,比如你所拥有的语句tten。

确保您使用的配料。如果不尝试使用激活的更新。

如果您想使用更新设置表中的值已经在数据库中的其他地方,你应该能够做一个更新。这可能会更快。

如果数据尚未在数据库中,可以在临时表做一个更新查询之前将其插入,但在这里,你将需要SQL查询(这是可能的休眠)。

但是,一个更新语句可能仍然太慢。最后的解决方案(没有完全重新思考用例的逻辑)我知道是一个'select for update'语句。这是原始的jdbc,但是弹簧JdbcTemplate,这并不是那么痛苦。您可以选择您想要更新的所有行(如果它发出请求更快,你可能会选择更多,但在这种情况下,你会对网络资源的影响,越来越多排出来比所需的分贝),然后更新他们在使用jdbc时会抓取它们。

相关问题