проблема с обновлением HQL - PullRequest
9 голосов
/ 26 июля 2011

Когда я пытаюсь выполнить следующий запрос HQL:

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

, я получаю это исключение:

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

РЕДАКТИРОВАТЬ:
Я также попытался выполнить следующее. Но это не работаетЛибо.

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

EDIT2: внесение изменений в hinbernate.cfg.xml решило мою проблему. Ранее я использовал

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

Теперь я использую следующее свойство

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

Ответы [ 5 ]

5 голосов
/ 26 июля 2011

Это не HQL-запрос. Вы хотите импортировать javax.persistence.Query, что позволяет normal sql, не org.hibernate.Query, который работает на объектах сущности .

Если вы хотите использовать простой SQL, вы также можете использовать PreparedStatement

Однако, если вы действительно хотите использовать hibernate, без использования сущностных объектов (полностью отказавшись от смысла использования hibernate, imho), вы можете сделать это следующим образом ( справочные документы ):

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();
3 голосов
/ 31 июля 2011

Вопрос думает на SQL, когда вы должны думать на объектах:

XYZ xyz = new XYZ();
xyz.setStatus(10);
getSession().merge(xyz);
0 голосов
/ 13 июня 2013

Используйте

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

в hibernate.cfg.xml файле для разрешения исключения:

org.hibernate.QueryException: query must begin with SELECT or FROM: update.....
0 голосов
/ 28 июля 2011
Session sesssion = getSession(); //getter for session

Для 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();

Здесь активность - POJO.

0 голосов
/ 28 июля 2011

Попробуйте:

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

Взгляните на это также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...