2011-04-21 85 views
3

我有一个将由整数列组成的表,每个列都是一个序列。每一行代表一个客户账户和与之相关的序列。HQL - 在一个查询中更新字段并返回结果值

我试图找到一种有效的方法来更新一个特定序列的值由一个变量,然后检索更新的值,所有在一个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的项目数量。通过在单个语句中执行此操作,我不必担心任何表锁定或并发问题。

所以......有没有人有更清洁的方式做到这一点?或者我只是在过度思考我已经可以做的事情?

回答

2

HQL中没有任何东西可以替换SQL中的返回子句。在Hibernate中的查询中执行UPDATE语句通常是可以避免的。它打破了缓存,改变了实体字段而没有滚动版本号,在你的会话的内存状态下软化,并且通常是不好的juju。通常在一个hibernate应用程序中,你只能使用更新查询来进行大批量操作,而使用会话的性能结果通常太多。

如果你这样做的频率足够高,在更新之前锁定实体是一个问题,那么本机sql可能是你最好的选择。直到它被证明是一个问题,我才会亲自担心它。你并不是真的在DB游标中做了很多额外的工作来选择更新你要更新的东西,但我也不是Postgres专家。

+0

我怀疑你是对的,而我正试图在这里过早优化。现在我要去选择锁定选项。它们应该都很短暂,如果它成为问题,那么我会在那时解决它。感谢您的意见。 – Jafoy 2011-04-21 13:29:03