Java 为什么OpenJPA抱怨;“声明意外结束”;在命名本机查询中使用EXISTS子句时?

Java 为什么OpenJPA抱怨;“声明意外结束”;在命名本机查询中使用EXISTS子句时?,java,sql,hibernate,jpa,openjpa,Java,Sql,Hibernate,Jpa,Openjpa,我在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

我在
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$000(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
    与子选择一起使用
更新/解决方案/上下文


我使用
HSQLDB
在JUnit测试设置中工作。在我的
Hibernate
版本中,我确实在连接属性中指定了
sql.syntax\u pgs=true
。然而,我在
OpenJPA
实现中错过了这一部分。如果没有此属性,
HSQLDB
无法理解相关的sql语句。

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

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


旁注:您可能也可以使用hibernate来比较;)

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

在我的
Hibernate
环境中,我将
sql.syntax\u pgs=true
HSQLDB
一起使用。然而,我在我的
OpenJPA
环境中错过了这一部分


似乎,
HSQLDB
不支持没有
sql的
SELECT EXISTS(…)
子句。syntax\u pgs=true
导致上述异常。

您使用什么数据库?异常发生在JUnit测试设置中。这是HSQLDB。谢谢@SternK。你指出了正确的方向:)谢谢你的评论。它为我指明了正确的方向。HSQLDB数据源配置缺少“sql.syntax_pgs=true”。