HSQLDB与postgres的兼容性问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HSQLDB与postgres的兼容性问题相关的知识,希望对你有一定的参考价值。
我的Postgres查询涉及SELECT FOR UPDATE
。
查询:
UPDATE TABLE_NAME SET COL1 = 'C1' WHERE COL2 IN
(SELECT COL2 FROM TABLE_NAME WHERE COL3 = 'C3' LIMIT 1 FOR UPDATE SKIP LOCKED)
使用HSQLDB进行测试。它没有FOR UPDATE
的支持。从HSQLDB2升级到2.2到2.3.3升级到2.4.0。但没有成功。请建议一些解决方法或我错过了什么。
添加了这个:
sql.syntax pgs=true;
遇到异常:
java.lang.reflect.UndeclaredThrowableException在com.sun.proxy $ Proxy43.update(来源不明)产生的原因:java.lang.reflect.InvocationTargetException产生的原因:org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的SQL语法[UPDATE TABLE_NAME设置COL1 =?其中COL2 in(从TABLE_NAME选择COL2,其中COL3 =?limit?FOR UPDATE SKIP LOCKED)];嵌套异常是java.sql.SQLSyntaxErrorException:意外令牌:FOR required:)atg.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:91)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator。的java:73)在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)在org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:655)在org.springframework.jdbc.core .JdbcTemplate.update(JdbcTemplate.java:876)在org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:937)在org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:942)在引起:java.sql.SQLSyntaxErrorException:意外令牌:FOR required:)org.hsqldb.jdbc.Util.sqlException(Unknown Source)org.hsqldb.jdbc.Util.sqlException(Unknown Source)org.hsqldb.jdbc .JDBCPreparedSta来自org.springframework.jdbc.core上com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:387)的org.hsqldb.jdbc.JDBCConnection.prepareStatement(未知来源)的(未知来源)。 JdbcTemplate的$ SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1530)在org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633)引起的:org.hsqldb.HsqlException:意外的标记:所需:)的组织。 hsqldb.error.Error.parseError(来源不明)在org.hsqldb.ParserBase.unexpectedTokenRequire(来源不明)在org.hsqldb.ParserBase.readThis(来源不明)在org.hsqldb.ParserDQL.XreadInPredicateRightPart(来源不明)在组织。位于org.hsqldb的org.hsqldb.ParserDQL.XreadBooleanFactorOrNull(未知来源)的org.hsqldb.ParserDQL.XreadBooleanTestOrNull(未知来源)的org.hsqldb.ParserDQL.XreadBooleanPrimaryOrNull(未知来源)中的hsqldb.ParserDQL.XreadPredicateRightPart(未知来源)。 ParserDQL.XreadBooleanTermOrNull(Unkno WN源)在org.hsqldb.ParserDQL.XreadBooleanValueExpression(未知来源)在org.hsqldb.ParserDML.compileUpdateStatement(未知来源)在org.hsqldb.ParserCommand.compilePart(未知来源)在org.hsqldb.ParserCommand.compileStatement(未知源来自org.hsqldb.Session.execute(未知来源)org.hsqldb.StatementManager.compile(未知来源)的org.hsqldb.Session.compileStatement(未知来源)
此查询语法特定于PostgreSQL行锁定支持。您可以将HSQLDB的查询修改为:
UPDATE TABLE_NAME SET COL1 = 'C1' WHERE COL2 IN
(SELECT COL2 FROM TABLE_NAME WHERE COL3 = 'C3' LIMIT 1)
事实上,这个简化的查询在HSQLDB中做了同样的事情,但是当与PostgreSQL一起使用时可能会有不同的结果:
UPDATE TABLE_NAME SET COL1 = 'C1' WHERE COL3 = 'C3'
如果你提到的sql.syntax pgs=true;
是一个URL属性,它应该有一个下划线,而不是空格,如下所示:sql.syntax_pgs=true;
但是,如果要将兼容模式设置为数据库查询,则可以执行:SET DATABASE SQL SYNTAX PGS TRUE
以上是关于HSQLDB与postgres的兼容性问题的主要内容,如果未能解决你的问题,请参考以下文章