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

时间:2016-08-08 16:58:53

标签: java hibernate jpa hql hibernate-criteria

我正在使用hibernate版本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 =“从test.APP_TABLE app_选择app_.ID为ID6_157_,其中app_.ID = 83700首先获取?仅限行

Problme似乎是'?'没有被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),

查询工作正常。

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

2 个答案:

答案 0 :(得分:0)

问题不是来自问号。 Hibernate将在执行查询时注入参数值。

此外,您不应使用字符串连接创建查询。它应该像

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

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

答案 1 :(得分:0)

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