2012-12-05 56 views
5

休眠本地查詢我寫原生SQL查詢,而不是使用HQL和麪臨roblem與位置參數

位置超出申報序參數的數量。請記住,序號參數是基於1的!您的位置:1個

<sql-query name="GET_ARRAY_MAX_POINT_QUESTION"> 
    <![CDATA[ 
     select TEST.TEST_ID as testId, TEST.VERSION_ID as versionId, 
     PASSED_TEST.RESULT as userResult, 
     PASSED_TEST.TIME_COMPLITED as timeComplited, 
     sum(COMPLEXITY) as maxTestResult from QUESTION 
     JOIN TEST_QUESTION ON QUESTION.QUESTION_ID = TEST_QUESTION.QUESTION_ID 
     JOIN TEST ON TEST.TEST_ID=TEST_QUESTION.TEST_ID 
     JOIN PASSED_TEST ON TEST.TEST_ID=PASSED_TEST.TEST_ID 
     AND TEST.VERSION_ID=PASSED_TEST.VERSION_ID 
     WHERE TEST.SUBJECT_ID = ? 
     AND PASSED_TEST.USER_ID = ? 
     GROUP BY PASSED_TEST.TEST_EVENT_ID 
     ]]> 
    </sql-query> 

和DAO

return session 
       .createSQLQuery(GET_ARRAY_MAX_POINT_QUESTION_NAME_QUERY) 
       .addScalar(TEST_ID_RESULT_PARAM, StandardBasicTypes.LONG) 
       .addScalar(VERSION_ID_RESULT_PARAM, StandardBasicTypes.LONG) 
       .addScalar(USER_RESULT_PARAM, StandardBasicTypes.DOUBLE) 
       .addScalar(MAX_TEST_RESULT_PARAM, StandardBasicTypes.DOUBLE) 
       .addScalar(TIME_COMPLITED_RESULT_PARAM, StandardBasicTypes.DATE) 
       .setParameter(0, subjectId) 
       .setParameter(1, userId) 
       .setResultTransformer(
         Transformers.aliasToBean(PassedTestStatistic.class)) 
       .list(); 

,我讀了//JPA specification. Only positional parameter binding may be portably used for native queries.這Hibernate中使用0作爲第一指標。

堆棧跟蹤

Caused by: org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1 
    at org.hibernate.engine.query.spi.ParameterMetadata.getOrdinalParameterDescriptor(ParameterMetadata.java:80) 
    at org.hibernate.engine.query.spi.ParameterMetadata.getOrdinalParameterExpectedType(ParameterMetadata.java:86) 
    at org.hibernate.internal.AbstractQueryImpl.determineType(AbstractQueryImpl.java:444) 
    at org.hibernate.internal.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:416) 
    at by.bsuir.testapp.database.hibernate.PassedTestHibernateDAO.getDataForPassedTestStatisticGraph(PassedTestHibernateDAO.java:73) 
    at by.bsuir.testapp.service.PassedTestServiceImpl.getDataForPassedTestStatisticGraph(PassedTestServiceImpl.java:58) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    at $Proxy28.getDataForPassedTestStatisticGraph(Unknown Source) 
    at by.bsuir.testapp.controller.StatisticPassedTest.createLinearModel(StatisticPassedTest.java:61) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262) 
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) 

// UPDATE

有趣的是,當我在查詢號碼設定值

WHERE TEST.SUBJECT_ID = 1 
     AND PASSED_TEST.USER_ID = 1 

我得到

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GET_ARRAY_MAX_POINT_QUESTION' at line 1 

但在MySQL中,我獲得了成功的結果。

我該如何判斷這個問題?

+0

這是什麼問題? –

+0

@JB Nizet超出聲明的序數參數的數量。請記住,序號參數是基於1的!位置:1 – Ray

+0

粘貼完整的堆棧跟蹤。 –

回答

2

請檢查

.setParameter(1, subjectId) 
.setParameter(2, userId) 

爲異常跟蹤,說,序參數是從1開始的!

+0

它也不起作用 – Ray

+0

異常似乎是誤導。它實際上是基於0的 – Rahul

1

你可以嘗試使用命名參數,而不是提供位置參數。

例如,

session 
    .createSQLQuery("update table1 set variable = variable + 1 where id = :id") 
    .setParameter("id", someId) 
    .executeUpdate(); 

原生SQL查詢支持位置以及命名參數。

請閱讀命名SQL查詢:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#d0e13930

+0

我嘗試使用位置參數從0,也從1,並命名也。 – Ray

7

你叫

session.createSQLQuery 

但我相信你需要調用

session.getNamedQuery 

使用命名查詢時。你的源

createSQLQuery(GET_ARRAY_MAX_POINT_QUESTION_NAME_QUERY) 

1

找你必須有變量指向包含像這樣的本地查詢的實際名稱的字符串:

GET_ARRAY_MAX_POINT_QUESTION_NAME_QUERY = "GET_ARRAY_MAX_POINT_QUESTION" 

錯誤你在這裏:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GET_ARRAY_MAX_POINT_QUESTION' at line 1 

表示createSqlQuery是叫不上名字找到你的本地查詢,但研究所ead試圖以原始SQL的名字執行「GET_ARRAY_MAX_POINT_QUESTION」這個名稱,就像放入s.createSqlQuery(「Select * from ...」)一樣。如果您查看文檔here,您將看到爲了查找一個命名的查詢,即使是本地的,你仍然必須使用getNamedQuery。

0

對於那些誰一派錯誤消息: 當我有一類的利益根本沒有映射得到這個錯誤。映射解決了這個問題。