为什么在命名本机查询中使用 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
我的问题是:
- 我在这里错过了什么?
- 这与 JPA 规范有关吗?
- 是否不允许在 OpenJPA 中将
EXISTS
与子 select 一起使用?
更新/解决方案/上下文
我正在使用 HSQLDB
在 JUnit 测试设置中工作。在我的 Hibernate
版本中,我确实在连接 属性 中指定了 sql.syntax_pgs=true
。但是,我在 OpenJPA
实现中错过了这部分。没有这个属性,HSQLDB
不理解相关的sql语句。
您是否尝试启用 sql 日志记录以查看对 JDBC 驱动程序语句的实际查询问题?
看起来也像是 jpa 层(jdbc 池或驱动程序)下的异常,因此如果 openjpa 重写(不应该)或不重写它,检查实际发送的语句可能会返回问题。
旁注:您可以对休眠做同样的事情来比较 ;)。
问题源于我的 JUnit 测试设置与 HSQLDB
。
在我的 Hibernate
环境中,我使用 sql.syntax_pgs=true
和 HSQLDB
。但是,我在 OpenJPA
环境中错过了那部分。
似乎 HSQLDB
不支持没有 sql.syntax_pgs=true
的 SELECT EXISTS(...)
子句导致上面列出的异常。
我在 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
我的问题是:
- 我在这里错过了什么?
- 这与 JPA 规范有关吗?
- 是否不允许在 OpenJPA 中将
EXISTS
与子 select 一起使用?
更新/解决方案/上下文
我正在使用 HSQLDB
在 JUnit 测试设置中工作。在我的 Hibernate
版本中,我确实在连接 属性 中指定了 sql.syntax_pgs=true
。但是,我在 OpenJPA
实现中错过了这部分。没有这个属性,HSQLDB
不理解相关的sql语句。
您是否尝试启用 sql 日志记录以查看对 JDBC 驱动程序语句的实际查询问题?
看起来也像是 jpa 层(jdbc 池或驱动程序)下的异常,因此如果 openjpa 重写(不应该)或不重写它,检查实际发送的语句可能会返回问题。
旁注:您可以对休眠做同样的事情来比较 ;)。
问题源于我的 JUnit 测试设置与 HSQLDB
。
在我的 Hibernate
环境中,我使用 sql.syntax_pgs=true
和 HSQLDB
。但是,我在 OpenJPA
环境中错过了那部分。
似乎 HSQLDB
不支持没有 sql.syntax_pgs=true
的 SELECT EXISTS(...)
子句导致上面列出的异常。