我有一个表,它将由整数列组成,每个列基本上都是一个序列。每行代表一个客户帐户,并且序列与之绑定。
我试图找到一种有效的方法,用一个可变数量更新特定序列的值,然后在一个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的项目数。通过在单个语句中执行此操作,我不必担心任何表锁定或并发问题。
所以......有没有人有更清洁的方法呢?或者我只是过度思考我已经可以做的事情了?
答案 0 :(得分:2)
在HQL中没有任何东西可以替换SQL中的returns子句。通常避免在Hibernate中的查询中执行UPDATE语句。它打破了缓存,改变了实体字段而没有滚动版本号,管理会话的内存状态,并且通常是糟糕的juju。通常在hibernate应用程序中,您只对大批量操作使用更新查询,其中使用Session的性能后果通常太多。
如果您以足够高的频率执行此操作,则在更新之前锁定实体是一个问题,本机sql可能是您的最佳选择。直到它被证明是一个问题,我个人不会担心它。你不是真的在数据库光标中做了那么多额外的工作来选择更新你要更新的东西,但我也不是postgres专家。