2012-12-05 5 views
5

Ich schrieb nativen SQL-Abfrage statt hql der Verwendung und konfrontiert mit roblemHibernate nativen Abfrage mit Positionsparameter

Position jenseits Anzahl der angegebenen Ordnungsparameter. Denken Sie daran, dass Ordinalparameter 1-basiert sind! Position: 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> 

Und 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(); 

ich gelesen, dass //JPA specification. Only positional parameter binding may be portably used for native queries. Und das Hibernate 0 als erster Index.

stacktrace

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

Interessant, wenn ich gesetzt in Abfrage Zahlenwerte

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

ich

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 

Aber in MySQL bekomme ich ein erfolgreiches Ergebnis.

Wie kann ich dieses Problem entscheiden?

+0

Und was ist das Problem? –

+0

@JB Nizet Position über die Anzahl der deklarierten Ordinalparameter hinaus. Denken Sie daran, dass Ordinalparameter 1-basiert sind! Position: 1 – Ray

+0

Fügen Sie die vollständige Stapelspur ein. –

Antwort

2

Bitte überprüfen

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

als die Ausnahme Spur sagt, dass Ordnungsparameter 1-basiert!

+0

Es funktioniert auch nicht – Ray

+0

die Ausnahme scheint irreführend. Es ist eigentlich 0 basierend – Rahul

1

Können Sie versuchen, benannte Parameter anstelle von Positionsparameter zu verwenden.

Für z.

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

Native SQL-Abfragen unterstützen sowohl positionsorientierte als auch benannte Parameter.

Bitte Named SQL-Abfragen in lauten: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#d0e13930

+0

Ich versuche mit Positionsparameter von 0, auch von 1, und mit auch benannt. – Ray

7

Sie rufen

session.createSQLQuery 

aber ich glaube, Sie

session.getNamedQuery 

bei Verwendung einer benannten Abfrage aufrufen müssen.

1

an Ihrer Quelle der Suche

createSQLQuery(GET_ARRAY_MAX_POINT_QUESTION_NAME_QUERY) 

müssen Sie Variable die auf eine Zeichenfolge haben den tatsächlichen Namen der nativen Abfrage wie so enthält:

GET_ARRAY_MAX_POINT_QUESTION_NAME_QUERY = "GET_ARRAY_MAX_POINT_QUESTION" 

Der Fehler erhalten Sie hier:

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 

Gibt an, dass createSqlQuery die systemeigene Abfrage nicht nach Namen, sondern nach inst findet Wenn Sie versuchen, den Namen "GET_ARRAY_MAX_POINT_QUESTION" als Raw SQL auszuführen, so als würden Sie s.createSqlQuery ("Select * from ...") eingeben. Wenn Sie sich die Dokumentation here ansehen, werden Sie das sehen, um nachzuschlagen eine benannte Abfrage, sogar eine native Abfrage, müssen Sie immer noch getNamedQuery verwenden.

0

Für diejenigen, die die Fehlermeldung googled: Bekam diesen Fehler, wenn ich überhaupt keine Zuordnung für eine Klasse von Interesse hatte. Mapping hat das Problem gelöst.