2012-10-26 6 views
7

ich eine native/raw mysql Abfrage mit Hibernate ausgeführt werden soll, ich habe dies:sagen die Position jenseits Anzahl der angegebenen Ordnungsparameter

sessionFactory.getCurrentSession().createSQLQuery(
     "update table1 set someCounter = someCounter + 1 where id = ?") 
    .setParameter(1, someId) 
    .executeUpdate(); 

ich den Fehler bekommen:

threw exception [Request processing failed; nested exception is 
     org.hibernate.QueryParameterException: Position beyond number of declared ordinal 
     parameters. Remember that ordinal parameters are 1-based! Position: 2] 
     with root cause 
     org.hibernate.QueryParameterException: Position beyond number of declared ordinal 
     parameters. Remember that ordinal parameters are 1-based! Position: 2 

Was ist falsch hier?

Antwort

12

Verwenden Sie den Index als 0, da der Parameterindex von 0 beginnt.

sessionFactory.getCurrentSession() 
    .createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?") 
    .setParameter(0, someId) 
    .executeUpdate(); 

Da Sie Hibernate verwenden, können Sie die benannten Parameter verwenden, als auch das heißt

sessionFactory.getCurrentSession() 
    .createSQLQuery("update table1 set someCounter = someCounter + 1 where id = :id") 
    .setParameter("id", someId) 
    .executeUpdate(); 
+2

Die Die Verwendung von benannten Parametern gilt für das Jav eine persistente Abfragesprache und ist nicht für systemeigene Abfragen definiert. –

+0

@ kmb385: Ich werde überprüfen, aber die Antwort trotzdem aktualisiert. –

+0

Meine Quelle: http://stackoverflow.com/questions/3144235/jpa-hibernate-native-queries-do-not-recognize-parameters –

3

Die Parameter einen Null-basierten Index verwenden. Versuchen:

sessionFactory.getCurrentSession().createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?") 
       .setParameter(0, someId) 
       .executeUpdate(); 

Die aktuellen Hibernate JavaDocs auch angeben, dass setPosition für Positionsparameter auf Null basierende Indizierung beruht. http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Query.html#setParameter%28int,%20java.lang.Object%29

setParameter 

Query setParameter(int position, 
        Object val) 
        throws HibernateException 

    Bind a value to a JDBC-style query parameter. The Hibernate type of the parameter is first detected via the usage/position in the query and if not sufficient secondly guessed from the class of the given object. 

    Parameters: 
     position - the position of the parameter in the query string, numbered from 0. 
     val - the non-null parameter value 
    Throws: 
     HibernateException - if no type could be determined 

Überprüfen Sie die aus dem Parameter Abschnitt dieses Dokuments: https://access.redhat.com/knowledge/docs/en-US/JBoss_Enterprise_Web_Server/1.0/html/Hibernate_Core_Reference_Guide/querysql.html#id3043464

Es gab einige Diskussionen darüber, ob die setParameter() -Methode Null basiert oder ein basiert. Diese Verwirrung ist auf die Ausnahme zurückzuführen, die das Poster erhält, indem es feststellt, dass die Parameter 1-basiert sind, während die JavaDoc angibt, dass sie nullbasiert sind. Ich analysierte den Hibernate-Quellcode und glaube, dass sie tatsächlich nullbasiert sind. Unter der Annahme, dass ich die richtige Klasse überprüft habe, verwendet der zugrunde liegende Code eine Liste zum Speichern der Parameter-Bind-Werte, was implizieren würde, dass die setParameter-Methode tatsächlich nullbasiert ist. Kasse den Quellcode für sich selbst: https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/internal/AbstractQueryImpl.java

0

Positional Parameter von 0 starten nicht 1

Native SQL queries support positional as well as named parameters:

Update Ihre Abfrage von 0 statt 1 in setParameter(1, someId) vorbei

sessionFactory.getCurrentSession().createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?") 
       .setParameter(0, someId) 
       .executeUpdate(); 

Ressource parameters

Verwandte Themen