Ray*_*Ray 5 java hibernate jpa hibernate-mapping
我写了本机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>
Run Code Online (Sandbox Code Playgroud)
和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();
Run Code Online (Sandbox Code Playgroud)
我读到了//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)
Run Code Online (Sandbox Code Playgroud)
// UPDATE
有趣的是,当我设置查询数值时
WHERE TEST.SUBJECT_ID = 1
AND PASSED_TEST.USER_ID = 1
Run Code Online (Sandbox Code Playgroud)
我明白了
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
Run Code Online (Sandbox Code Playgroud)
但在MySQL中我得到了成功的结果.
我怎么决定这个问题?
你打电话
session.createSQLQuery
Run Code Online (Sandbox Code Playgroud)
但我相信你需要打电话
session.getNamedQuery
Run Code Online (Sandbox Code Playgroud)
使用命名查询时.
请检查
.setParameter(1, subjectId)
.setParameter(2, userId)
Run Code Online (Sandbox Code Playgroud)
正如异常跟踪所示,序数参数是从 1 开始的!
| 归档时间: |
|
| 查看次数: |
19184 次 |
| 最近记录: |