HSQLDB与postgres兼容的问题

时间:2018-05-05 06:22:48

标签: java database postgresql hsqldb dbunit

我的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 at   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:)at   org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:91)   在   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)   at引发者:java.sql.SQLSyntaxErrorException:意外令牌:FOR   必需:)在org.hsqldb.jdbc.Util.sqlException(未知来源)at   org.hsqldb.jdbc.Util.sqlException(未知来源)at   org.hsqldb.jdbc.JDBCPreparedStatement。(未知来源)at   org.hsqldb.jdbc.JDBCConnection.prepareStatement(未知来源)at   com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:387)   在   org.springframework.jdbc.core.JdbcTemplate $ SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1530)   在   org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633)   引起:org.hsqldb.HsqlException:意外令牌:FOR required:)   在org.hsqldb.error.Error.parseError(未知来源)at   org.hsqldb.ParserBase.unexpectedTokenRequire(未知来源)at   org.hsqldb.ParserBase.readThis(未知来源)at   org.hsqldb.ParserDQL.XreadInPredicateRightPart(未知来源)at at   org.hsqldb.ParserDQL.XreadPredicateRightPart(未知来源)at   org.hsqldb.ParserDQL.XreadBooleanPrimaryOrNull(未知来源)at at   org.hsqldb.ParserDQL.XreadBooleanTestOrNull(未知来源)at   org.hsqldb.ParserDQL.XreadBooleanFactorOrNull(未知来源)at at   org.hsqldb.ParserDQL.XreadBooleanTermOrNull(未知来源)at at   org.hsqldb.ParserDQL.XreadBooleanValueExpression(未知来源)at at   org.hsqldb.ParserDML.compileUpdateStatement(未知来源)at   org.hsqldb.ParserCommand.compilePart(未知来源)at   org.hsqldb.ParserCommand.compileStatement(未知来源)at   org.hsqldb.Session.compileStatement(未知来源)at   org.hsqldb.StatementManager.compile(未知来源)at   org.hsqldb.Session.execute(未知来源)

2 个答案:

答案 0 :(得分:0)

此查询语法特定于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'

答案 1 :(得分:0)

如果您提到的sql.syntax pgs=true;是URL属性,则它应具有  下划线,而不是空格,如下所示: sql.syntax_pgs=true;

但是,如果要将兼容模式设置为数据库查询,则可以执行: SET DATABASE SQL SYNTAX PGS TRUE