2011-07-26 23 views
9

Kiedy próbuję wykonać następujące zapytanie: HQLproblem z aktualizacją HQL

Query query = getSession().createQuery("update XYZ set status = 10"); 
query.executeUpdate(); 

otrzymuję ten wyjątek:

Exception in thread "main" org.hibernate.QueryException: query must begin with SELECT or FROM: update 

EDIT:
Próbowałem również następujące .Ale doennot to działało .

org.hibernate.Query query = getSession().createQuery("update XYZ t set t.status = 10"); 

EDIT2: dokonywania zmian w hinbernate.cfg.xml rozwiązać mój problem Wcześniej używałem

setting hibernate.query.factory_class" = org.hibernate.hql.classic.ClassicQueryTranslatorFactor 

Teraz używam następującą właściwość

<property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property> 
+0

Jaka wersja hibernować? –

+1

Zobacz https://forum.hibernate.org/viewtopic.php?t=944696&highlight=query+begin+select+delete – kalyan

+0

@Ray toal: Wersja 3.2.5 – akshay

Odpowiedz

5

ów nie jest HQL pytanie. Chcesz zaimportować javax.persistence.Query, który zezwala na normalny sql, nie org.hibernate.Query, który działa na entity objects.

Jeśli chcesz użyć prostego SQL, można też użyć PreparedStatement

Jednakże, jeśli naprawdę chcesz używać hibernacji, nie wykorzystując entityobjects (całkowicie pokonując punkt przy użyciu hibernacji w pierwszej kolejności, imho) można zrobić to w ten sposób (reference docs):

String myUpdate = "update XYZ myAlias set myAlias.status = :newStatus"; 
// or String noAliasMyUpdate = "update XYZ set status = :newStatus"; 
int updatedEntities = getSession().createQuery(myUpdate) //or noAliasMyUpdate 
     .setInt("newStatus", 10) 
     .executeUpdate(); 
+0

Dobrze. Poszukałbym również tego z createSQLQuery. –

+0

+1, chociaż nie zgadzam się z tobą w kwestii pokonania punktu użycia Hibernate. Moim zdaniem czasami wystarczy wykonać kilka operacji zbiorczych. Umieszczenie kwerendy nazwanej w odpowiednim pliku zapobiegnie uruchomieniu hibernacji w przypadku zmiany obiektu. Więc to naprawisz. Zamiast zapominać o aktualizacjach zbiorczych, dopóki ich nie wykonasz. – ssedano

+0

@Udo Fholl Prawda, ale to tylko prosta aktualizacja - nie jest to operacja zbiorcza. Mam wrażenie, że NamedQueries są poza zakresem tego pytania. – NimChimpsky

0

Spróbuj:

Query query = getSession().createQuery("update XYZ o set o.status = 10"); 
query.executeUpdate(); 

Spójrz na this również.

+0

czy to faktycznie działa, myślałem, że musisz podać nazwany parametr, a następnie ustawić? – NimChimpsky

+0

Musisz dodać parametr, jeśli istnieje nazwany parametr. – ssedano

+0

@all: Próbowałem z twoim podejściem, jak wspomniano w mojej ostatniej edycji, ale to nie działa – akshay

0
Session sesssion = getSession(); //getter for session 

Dla HQL:

String hql = "update Activity " + 
"set startedOn = :taskStartedOn " + 
"where id = :taskId"; 

Query query = session.createQuery(hql); 
query.setDate("taskStartedOn",new Date()); 
query.setLong("taskId",1) 
int rowCount = query.executeUpdate(); 

Tutaj aktywny jest POJO.

+0

Nie ma tu odwołania do Activity jak pojo; Uważam to za mylące. I musisz podać nazwany parametr, a następnie ustawić go za pomocą hibernacji? – NimChimpsky

+0

Aktywność jest nazwą mojego POJO i tak, ma również nazwany parametr "taskstartedOn" i "taskId". "startOn" i "id" to właściwości POJO. –

+0

Pojo nie jest nigdzie używane w twoim fragmencie, drugie wyrażenie sql nie używa nazwanego parametru. – NimChimpsky

3

Pytanie myślenia w SQL, kiedy należy myśleć w obiektach:

XYZ xyz = new XYZ(); 
xyz.setStatus(10); 
getSession().merge(xyz); 
0

Korzystając

hibernate.query.factory_class = org.hibernate.hql.ast.ASTQueryTranslatorFactory 

w hibernate.cfg.xml pliku, aby rozwiązać wyjątek:

org.hibernate.QueryException: query must begin with SELECT or FROM: update..... 
Powiązane problemy