Java &引用;“正确”;HSQLDB 2.0.0-rc8中选择下一个序列值的方法

Java &引用;“正确”;HSQLDB 2.0.0-rc8中选择下一个序列值的方法,java,sql,hibernate,orm,hsqldb,Java,Sql,Hibernate,Orm,Hsqldb,假设我有一个序列,叫做TEST_SEQ 选择下一个值的正确方法是什么? 这不起作用: select next value for TEST_SEQ 可能是因为它需要一个“FROM”子句。 查看hibernate中的hsqlDialante.getSequenceNextValString(),我看到了以下内容: "select next value for " + sequenceName + " from dual_" + sequenceName 在我的情况下,这会导致如下结果: selec

假设我有一个序列,叫做TEST_SEQ 选择下一个值的正确方法是什么? 这不起作用:

select next value for TEST_SEQ
可能是因为它需要一个“FROM”子句。 查看hibernate中的hsqlDialante.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的行,在这种情况下,这将起作用(oracle风格):

但是hsqldb并没有这个现成的表,我也不知道如何让hibernate在“第一次启动”时生成这样一个表

我认为必须有一种方法从盒子里取出序列的下一个值,而我只是错过了它。 有什么想法吗

假设我有一个名为TEST_SEQ的序列,选择下一个值的正确方法是什么

而政府说:

序列的下一个值可以包含在SELECT、INSERT和UPDATE语句中,如下例所示:

SELECT [...,] NEXT VALUE FOR <sequencename> [, ...] FROM <tablename>;
因此,我的建议是:升级到更新版本的Hibernate,您很可能使用Hibernate Core 3.2.5或更高版本。

显然,如果您运行

设置数据库SQL语法PGS TRUE
(PGS代表Postgres)

然后,您可以使用标准Postgres语法查询它,如
selectNextval('sequence\u name')

如果尚未调用
nextval
,它甚至不会为
curval
返回任何内容,这可能与Postgres的行为类似

还请注意,如果您这样做一次,典型的HSQLDB序列(如序列名称的
调用下一个值)将不再工作。看起来它们仍然有效

还要注意,更多的“异国情调”Postgres内容,如
select last\u value from schemaName.sequence\u name
尚未被模拟/不起作用(用于获取序列的当前值,而不考虑会话)


避免由于以下原因导致此消息:
:org.hsqldb.hsqleexception:用户缺少权限或找不到对象:NEXTVAL

可能hibernate正在动态创建那些双\u xx表?奇怪

无论如何,您的方式在hsqldb 2.3.2中似乎对我有效:

 select next value for <sequence name>;
为选择下一个值;
但是你不能给名字加别名,因为我必须这样做:

  select next value for <sequence name> as <my name>, 3
为as选择下一个值,3

然后别名起作用了,不需要双重密码<代码>调用下一个值
我似乎无法别名…

@hatchtman82不客气。顺便说一句:识别一个好答案的常用方法是向上投票;)@没问题。只是如果你认为答案是一个好的答案(很可能你接受它),那么IMO投票是有意义的,这就是如此。嗨,这可能是相关的。我正在使用Apache的DdlUtils在启动时生成数据库,使用这个xml作为id:
。插入对象时,我应该如何获得新的键值?我也在使用iBatis。
public String getSequenceNextValString(String sequenceName) {
    return "call next value for " + sequenceName;
}
 select next value for <sequence name>;
  select next value for <sequence name> as <my name>, 3