java—为什么openjpa在命名本机查询中使用exists子句时会抱怨“语句意外结束”?

llew8vvj  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(242)

我有一个 @NamedNativeQueryHibernate ,效果很好:

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规范有关吗?
我不能用吗 EXISTS 在openjpa中有一个子选择?
更新/解决方案/上下文
我在junit测试设置中使用 HSQLDB . 在我的 Hibernate 版本,我确实指定了 sql.syntax_pgs=true 在连接属性中。然而,我错过了这一部分 OpenJPA 实施。没有这个财产, HSQLDB 不理解相关的sql语句。

eqzww0vc

eqzww0vc1#

您是否尝试启用sql日志记录来查看jdbc驱动程序语句的实际查询问题?
在jpa层(jdbc池或驱动程序)下看起来也是一个异常,因此如果openjpa重写(不应该)或不重写,那么检查实际发送的语句可能会返回问题。
旁注:您可以对hibernate做同样的比较;)。

emeijp43

emeijp432#

这个问题源于我的junit测试设置与 HSQLDB .
在我的 Hibernate 环境,我用的是 sql.syntax_pgs=trueHSQLDB . 然而,我在我的生活中错过了这一部分 OpenJPA 环境。
看来 HSQLDB 不支持 SELECT EXISTS(...) 无条件子句 sql.syntax_pgs=true 导致上述例外情况。

相关问题