setMaxResults(max_size) 抛出 Sql 命令未正确结束异常

Posted

技术标签:

【中文标题】setMaxResults(max_size) 抛出 Sql 命令未正确结束异常【英文标题】:setMaxResults(max_size) throws Sql command not properly ended exception 【发布时间】:2016-08-08 16:58:52 【问题描述】:

我使用的是休眠版本 4.3.11.Final 和 1.0.0.Final。 hibernate.dilect=org.hibernate.dialect.Oracle12cDialect

final String hql1 = "select s from " + app.class.getSimpleName() + " s where s.Id = " + getId();
When i'm calling 
mEntityManager.createQuery(hql1, app.class).setMaxResults(3);

生成的 hql = "select app_.ID as ID6_157_ from test.APP_TABLE app_ where app_.ID=83700 fetch first ? rows only"

问题似乎是“?”没有被 setMaxResults 的值 3 替换,但无法弄清楚如何修复它。 它抛出异常:-

java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended

 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
 oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
 oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
 oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
 oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
 oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
 oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884)
 oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)
 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289)
 oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
 oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
 oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)
 com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
 com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:80)
 org.hibernate.loader.Loader.getResultSet(Loader.java:2065)
 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862)
 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838)
 org.hibernate.loader.Loader.doQuery(Loader.java:909)
 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
 org.hibernate.loader.Loader.doList(Loader.java:2553)
 org.hibernate.loader.Loader.doList(Loader.java:2539)
 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369)
 org.hibernate.loader.Loader.list(Loader.java:2364)
 org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496)
 org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
 org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231)
 org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)
 org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
 org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
 org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)

如果我从 createQuery 中删除 setMaxResults(3),查询工作正常。

任何建议可能是什么原因。

【问题讨论】:

select app_.ID as ID6_157_ from test.APP_TABLE app_ where app_.ID=83700 fetch first ?仅行 此查询与 JPA 无关。为什么使用错误的标签? 【参考方案1】:

感谢大家的回复。 我想出了解决我的问题的方法。 我将休眠方言更改为“org.hibernate.dialect.Oracle10gDialect”,我的问题得到了解决。 谢谢。

【讨论】:

【参考方案2】:

问题不在于问号。 Hibernate 会在执行查询时注入参数值。

此外,您不应使用字符串连接来创建查询。应该是这样的

entityManager.createQuery("Select s from Apps s where s.id = :id")
 .setParameter(":id", id)
 .setMaxResults(3);

我认为问题在于包名称为“test.”的表名 test.APP_TABLE。您可以尝试将生成的查询复制并直接在Oracle中运行,查看结果并找出错误所在。

【讨论】:

以上是关于setMaxResults(max_size) 抛出 Sql 命令未正确结束异常的主要内容,如果未能解决你的问题,请参考以下文章

query.setFirstResult,query.setMaxResults

即使未定义 `setMaxResults`,JPA 也会限制 `queryResultLimit`

当 Doctrine 查询已加入时,setMaxResults 无法正常工作

hibernate的分页怎么用?

为啥 std::vector max_size() 函数会返回 -1?

Python 非递归遍历图