Hibernate 对H2(甲骨文模式)有什么想法;语法错误:从[*]DUAL";中选择NEXTVAL;?

Hibernate 对H2(甲骨文模式)有什么想法;语法错误:从[*]DUAL";中选择NEXTVAL;?,hibernate,h2,Hibernate,H2,我在Oracle模式下使用H2(v1.3.154)时出现以下错误: <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.h2.Driver" /> <property name="url" value="jdbc:h2:

我在Oracle模式下使用H2(v1.3.154)时出现以下错误:

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.h2.Driver" />
        <property name="url" value="jdbc:h2:mem:testdb;MODE=Oracle" />
        <property name="username" value="sa" />
        <property name="password" value="" />
</bean>
错误:

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT 
SQ_PERSON_ID.NEXTVAL FROM[*] DUAL "; expected "identifier"; SQL statement:
select SQ_PERSON_ID.nextval from dual [42001-154]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
at org.h2.message.DbException.get(DbException.java:167)
at org.h2.message.DbException.getSyntaxError(DbException.java:192)
at org.h2.command.Parser.readColumnIdentifier(Parser.java:2752)
at org.h2.command.Parser.readTermObjectDot(Parser.java:2311)
at org.h2.command.Parser.readTerm(Parser.java:2428)
at org.h2.command.Parser.readFactor(Parser.java:2025)
at org.h2.command.Parser.readSum(Parser.java:2012)
at org.h2.command.Parser.readConcat(Parser.java:1985)
at org.h2.command.Parser.readCondition(Parser.java:1850)
at org.h2.command.Parser.readAnd(Parser.java:1831)
at org.h2.command.Parser.readExpression(Parser.java:1823)
at org.h2.command.Parser.parseSelectSimpleSelectPart(Parser.java:1736)
at org.h2.command.Parser.parseSelectSimple(Parser.java:1768)
at org.h2.command.Parser.parseSelectSub(Parser.java:1663)
at org.h2.command.Parser.parseSelectUnion(Parser.java:1508)
at org.h2.command.Parser.parseSelect(Parser.java:1496)
at org.h2.command.Parser.parsePrepared(Parser.java:401)
at org.h2.command.Parser.parse(Parser.java:275)
at org.h2.command.Parser.parse(Parser.java:247)
at org.h2.command.Parser.prepare(Parser.java:201)
at org.h2.command.Parser.prepareCommand(Parser.java:214)
at org.h2.engine.Session.prepareLocal(Session.java:426)
at org.h2.engine.Session.prepareCommand(Session.java:374)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1100)
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:71)
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:243)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
at org.hibernate.jdbc.AbstractBatcher.prepareSelectStatement(AbstractBatcher.java:145)
at org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.java:106)
... 81 more
原因:org.h2.jdbc.jdbcsql异常:SQL语句“SELECT”中的语法错误
SQ_PERSON_ID.NEXTVAL FROM[*]DUAL”;预期的“标识符”;SQL语句:
从dual[42001-154]中选择SQ_PERSON_ID.nextval
位于org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
位于org.h2.message.DbException.get(DbException.java:167)
位于org.h2.message.DbException.getSyntaxError(DbException.java:192)
位于org.h2.command.Parser.readColumnIdentifier(Parser.java:2752)
位于org.h2.command.Parser.readTermObjectDot(Parser.java:2311)
位于org.h2.command.Parser.readTerm(Parser.java:2428)
位于org.h2.command.Parser.readFactor(Parser.java:2025)
位于org.h2.command.Parser.readSum(Parser.java:2012)
位于org.h2.command.Parser.readConcat(Parser.java:1985)
位于org.h2.command.Parser.readCondition(Parser.java:1850)
位于org.h2.command.Parser.readAnd(Parser.java:1831)
位于org.h2.command.Parser.readExpression(Parser.java:1823)
位于org.h2.command.Parser.parseSelectSimpleSelectPart(Parser.java:1736)
位于org.h2.command.Parser.parseSelectSimple(Parser.java:1768)
位于org.h2.command.Parser.parseSelectSub(Parser.java:1663)
位于org.h2.command.Parser.parseSelectUnion(Parser.java:1508)
位于org.h2.command.Parser.parseSelect(Parser.java:1496)
位于org.h2.command.Parser.parsePrepared(Parser.java:401)
位于org.h2.command.Parser.parse(Parser.java:275)
位于org.h2.command.Parser.parse(Parser.java:247)
位于org.h2.command.Parser.prepare(Parser.java:201)
位于org.h2.command.Parser.prepareCommand(Parser.java:214)
位于org.h2.engine.Session.prepareLocal(Session.java:426)
位于org.h2.engine.Session.prepareCommand(Session.java:374)
位于org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1100)
在org.h2.jdbc.JdbcPreparedStatement。(JdbcPreparedStatement.java:71)
在org.h2.jdbc.JdbcConnection.prepareStatement上(JdbcConnection.java:243)
位于org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
位于org.hibernate.jdbc.AbstractBatcher.prepareSelectStatement(AbstractBatcher.java:145)
位于org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.java:106)
... 81多

知道会发生什么吗,我的配置中有一个失误?我找到并尝试了修补程序,但无法解决错误。谢谢你的帮助

除了任何可能的Hibernate问题外,您的
SA
用户是否具有针对序列的select权限,该序列似乎位于不同的模式中?(请参见文档中的)。

请确保已创建序列。如果已创建,则对我有效:

create sequence SQ_PERSON_ID;
select SQ_PERSON_ID.nextval from dual;

如果未创建该序列,则会抛出与您得到的相同的错误消息。

检查您是否使用了创建该序列的相同模式。如果没有,请在序列名之前插入一个模式前缀,例如MYUSER.MY_SEQ。

我正在使用Oracle模式处理h2,但上面提到的所有解决方案都不适用于我。 虽然经过一些研究后,我发现这个查询对于获取序列中的下一个值很有效


选择nextval('SchemaName','SequenceName')

正如@longliveenduro所提到的


这绝对是说“序列不存在”的H2方式

我遇到了完全相同的问题,并发现序列不是在内存数据库中的h2中创建的。我通过添加以下内容解决了问题:

CREATE SEQUENCE SQ_PERSON_ID
MINVALUE 1
MAXVALUE 9223372036854775807
START WITH 1
INCREMENT BY 1
CACHE 8
NOCYCLE;
在:test/resources/schema.sql中


这对我有用

再补充一点,h2与oracle不同,它区分大小写。因此,DDL和java代码至少应该对序列名使用相同的大小写

我不这么认为,因为这是一个语法错误,而不是权限被拒绝或找不到表……我对您链接到的帖子的理解是,H2不识别序列名,并且正在生成标识符消息,您没有看到Oracle错误。但我不熟悉这个,也不熟悉它在引擎盖下是如何工作的。假设序列所属的模式包含在您的模式搜索路径中,我仍然会检查您是否可以通过SQL*Plus等在连接为
SA
时看到它。(作为一个非常天真的猜测,可能H2的作用相当于查找
所有对象
所有序列
)。这绝对是H2表示“序列不存在”的方式。与此错误消息有相同的问题。谢谢!这很有效。。我被困在同一件事上,上述解决方案都不起作用。。
CREATE SEQUENCE SQ_PERSON_ID
MINVALUE 1
MAXVALUE 9223372036854775807
START WITH 1
INCREMENT BY 1
CACHE 8
NOCYCLE;