为什么在命名本机查询中使用 EXISTS 子句时 OpenJPA 会抱怨 "unexpected end of statement"?

Why does OpenJPA complain about "unexpected end of statement" when using EXISTS clause in named native query?

我在 Hibernate 中有一个 @NamedNativeQuery,效果很好:

SELECT EXISTS (SELECT (ui.user_id) FROM USERS_INSTITUTION ui, USERS u WHERE u.id = ui.user_id AND ui.INSTITUTION_ID = ?1 AND u.username = ?2)

但是,我需要将此查询移植到 OpenJPA。遗憾的是,这会导致异常:

Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: unexpected end of statement in statement [SELECT EXISTS (SELECT (ui.user_id) FROM USERS_INSTITUTION ui, USERS u WHERE u.id = ui.user_id AND ui.INSTITUTION_ID = ? AND u.username = ?)] {SELECT EXISTS (SELECT (ui.user_id) FROM USERS_INSTITUTION ui, USERS u WHERE u.id = ui.user_id AND ui.INSTITUTION_ID = ? AND u.username = ?)} [code=-5590, state=42590]
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:219) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:199) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access[=12=]0(LoggingConnectionDecorator.java:58) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.prepareStatement(LoggingConnectionDecorator.java:252) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:138) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.prepareStatement(ConfiguringConnectionDecorator.java:144) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:138) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$RefCountConnection.prepareStatement(JDBCStoreManager.java:1695) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:127) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:517) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:497) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:486) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.jdbc.kernel.SQLStoreQuery$SQLExecutor.prepareStatement(SQLStoreQuery.java:310) ~[openjpa-3.1.0.jar:3.1.0]
    at org.apache.openjpa.jdbc.kernel.SQLStoreQuery$SQLExecutor.executeQuery(SQLStoreQuery.java:217) ~[openjpa-3.1.0.jar:3.1.0]
    ... 59 more

我的问题是:

更新/解决方案/上下文

我正在使用 HSQLDB 在 JUnit 测试设置中工作。在我的 Hibernate 版本中,我确实在连接 属性 中指定了 sql.syntax_pgs=true。但是,我在 OpenJPA 实现中错过了这部分。没有这个属性,HSQLDB不理解相关的sql语句。

您是否尝试启用 sql 日志记录以查看对 JDBC 驱动程序语句的实际查询问题?

看起来也像是 jpa 层(jdbc 池或驱动程序)下的异常,因此如果 openjpa 重写(不应该)或不重写它,检查实际发送的语句可能会返回问题。

旁注:您可以对休眠做同样的事情来比较 ;)。

问题源于我的 JUnit 测试设置与 HSQLDB

在我的 Hibernate 环境中,我使用 sql.syntax_pgs=trueHSQLDB。但是,我在 OpenJPA 环境中错过了那部分。

似乎 HSQLDB 不支持没有 sql.syntax_pgs=trueSELECT EXISTS(...) 子句导致上面列出的异常。