HQL - 在一个查询中更新字段并返回结果值

4
我有一张表格,其中包含整数列,每一列本质上都是一个序列。每一行代表一个客户账户及其相关的序列。
我正在尝试找到一种有效的方法来通过变量来更新特定序列的值,并在一个HQL查询中检索更新后的值。我正在使用Hibernate 3.6.1和Spring 3.0.5。数据库是Postgres。
我可以使用原生SQL查询来实现我的目标,如下所示:
update account.sequences set seq1 = seq1 + :seqIncrement where account_id = :accountId returning seq1;

然而,我更喜欢使用现有的实体名称/字段而不是表名。更新名称的地方越少,就越好。

我不使用序列,因为我最终将处理成千上万个它们,并且从来不会真正成为一个直接的递增操作。我计划更新该值以覆盖我需要唯一ID的项目数量。通过在单个语句中执行此操作,我不必担心任何表锁定或并发问题。

那么...有人有更简洁的方法吗?还是我正在过度思考已经可以做到的事情?

1个回答

4
在HQL中,没有任何东西可以替代SQL中的返回语句。通常情况下,应该避免在Hibernate查询中执行UPDATE语句。这会破坏缓存、修改实体字段而不滚动版本号、损坏会话的内存状态,总之就是不好的行为。通常,在Hibernate应用程序中,您只会在需要处理大批量操作时使用更新查询,因为使用Session通常会带来性能问题。
如果您频繁地进行此操作,并且在更新之前锁定实体是一个问题,那么本机SQL可能是最好的选择。在DB游标中选择要更新的内容进行锁定并不会增加太多额外的工作量,但我也不是Postgres专家,所以个人认为在证明确实存在问题之前,不必过于担心。

我怀疑你是对的,而我在这里试图过早优化。现在我将选择锁定选项。它们应该都非常短暂,如果以后出现问题,我会再处理。感谢您的建议。 - Jafoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接