2012-10-26 9 views
7

chcę wykonać rodzimych/raw zapytanie mysql przy użyciu hibernacji, mam to:Mówiąc pozycja poza liczby deklarowanych parametrów porządkowych

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

Dostaję błąd:

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 

Co'S źle tutaj?

Odpowiedz

12

Użyj indeksu jako 0 od początku indeksu parametrów od 0.

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

Ponieważ używasz hibernacji, można użyć nazwany parametr jak dobrze tj

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

The użycie nazwanych parametrów dotyczy Jav język zapytań o trwałość i nie jest zdefiniowany dla natywnych zapytań. –

+0

@ kmb385: Sprawdzę, ale i tak zaktualizowałem odpowiedź. –

+0

Moje Źródło: http://stackoverflow.com/questions/3144235/jpa-hibernate-native-queries-do-not-recognize-parameters –

3

Parametry używać indeksu opartego zero. Spróbuj:

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

Obecne Javadocs Hibernate określić również, że setPosition opiera się na zerowym indeksacji w oparciu o parametry pozycyjne. 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 

Sprawdź się w sekcji Parametry tego dokumentu: https://access.redhat.com/knowledge/docs/en-US/JBoss_Enterprise_Web_Server/1.0/html/Hibernate_Core_Reference_Guide/querysql.html#id3043464

Poczyniono pewne dyskusja dotycząca tego, czy metoda setParameter() wynosi zero lub jeden oparty na bazie. To zamieszanie wynika z wyjątku otrzymanego przez plakat, że parametry są oparte na 1, podczas gdy JavaDoc stwierdza, że ​​są one oparte na zera. Przeanalizowałem kod źródłowy Hibernacji i sądzę, że są one oparte na zero. Zakładając, że sprawdziłem właściwą klasę, bazowy kod używa listy do przechowywania wartości powiązań parametrów, co oznaczałoby, że metoda setParameter jest oparta na zero. Kasy kodu źródłowego dla siebie: https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/internal/AbstractQueryImpl.java

0

Positional parametry zacząć od 0 nie 1

Native SQL queries support positional as well as named parameters:

aktualizacji zapytanie przekazując 0 zamiast 1 w setParameter(1, someId)

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

zasobu parameters

Powiązane problemy