假设我有一个名为TEST_SEQ的序列 选择下一个值的正确方法是什么? 这不起作用:
select next value for TEST_SEQ
可能是因为它需要一个“FROM”子句。 在hibernate中查看HSQLDialect.getSequenceNextValString()我看到了:
"select next value for " + sequenceName + " from dual_" + sequenceName
在我的情况下会产生类似的结果:
select next value for TEST_SEQ from dual_TEST_SEQ
不适用于2.0.0-rc8(我只假设这适用于2.0之前的版本 - 尚未验证) 我遇到了一个解决方案,涉及创建一个名为DUAL的1行简单表,在这种情况下,这将起作用(oracle风格):
select next value for TEST_SEQ from DUAL
但是hsqldb没有开箱即用这个表,我不知道如何在“首次启动”时生成这样的表来进行休眠。
我认为必须有一种方法来获得开箱即用的序列的下一个值,我只是错过它。 任何想法?
答案 0 :(得分:25)
假设我有一个名为TEST_SEQ的序列,那么选择下一个值的正确方法是什么?
虽然documentation说:
序列的下一个值可以包含在SELECT,INSERT和UPDATE语句中,如下例所示:
SELECT [...,] NEXT VALUE FOR <sequencename> [, ...] FROM <tablename>;
“正确”的方式(因为更简单,因为不涉及HSQLDB没有的哑表DUAL表这样的表)将是:
call NEXT VALUE FOR [sequence_name];
这出现在1.7.2中,这实际上是Hibernate如何处理Hibernate Core的HSQLDialect
“最近”版本中的序列(参见 HHH-2839 )。
事实上,这就是我在HSQLDialect
hibernate-core-3.3.0.SP1.jar
中看到的内容:
public String getSequenceNextValString(String sequenceName) {
return "call next value for " + sequenceName;
}
所以我的建议是:升级到更新版本的Hibernate,你很可能使用Hibernate Core 3.2.5或更早版本。
答案 1 :(得分:2)
显然,如果你跑
SET DATABASE SQL SYNTAX PGS
(PGS代表Postgres)
然后您可以使用标准Postgres语法查询它,例如select nextval('sequence_name')
http://hsqldb.org/doc/guide/dbproperties-chapt.html
另请注意,如果您曾经这样做过,典型的HSQLDB序列(如call NEXT VALUE FOR SEQUENCE_NAME
)将不再有效。
答案 2 :(得分:0)
也许冬眠正在动态创建那些dual_xx表?很奇怪。
无论如何,对于hsqldb 2.3.2,您的方式似乎对我有用:
select next value for <sequence name>;
但是您不能为该名称起别名,因为我必须这样做:
select next value for <sequence name> as <my name>, 3
然后别名起作用,不需要双重名称。 call next value
我似乎没有别名...