HQL - обновление запроса не беспокоит
Я сделал реализацию Hibernate. Вот код, связанный с функцией обновления.
Query updateQuery = session.createQuery(" update User set registered = '1' " + " where user_activation_key = '"+userUUID+"'");
int result = updateQuery.executeUpdate();
session.getTransaction().commit();
Я получаю это исключение
Exception in thread "main" org.hibernate.QueryException: query must begin with SELECT or FROM: update [ update com.shop.domain.User set registered = '1' where user_activation_key = '04c42f1c-a55d-49cd-8bde-8d340f054d76']
at org.hibernate.QueryException.generateQueryException(QueryException.java:137)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120)
at org.hibernate.hql.internal.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:247)
at org.hibernate.hql.internal.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:209)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1796)
at com.shop.service.ORMService.isUserAvailable(ORMService.java:56)
at com.shop.service.ORMService.activateUserAccount(ORMService.java:39)
at com.shop.web.controller.Test.main(Test.java:10) Caused by: org.hibernate.QueryException: query must begin with SELECT or FROM: update
at org.hibernate.hql.internal.classic.ClauseParser.token(ClauseParser.java:104)
at org.hibernate.hql.internal.classic.PreprocessingParser.token(PreprocessingParser.java:131)
at org.hibernate.hql.internal.classic.ParserHelper.parse(ParserHelper.java:61)
at org.hibernate.hql.internal.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:239)
... 10 more
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">root123</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory</property>
<mapping resource="com/shop/domain/User.hbm.xml"></mapping>
</session-factory>
Что это, запрос должен начинаться с SELECT или FROM: update? Нужна помощь?
3 ответа
В файле конфигурации измените свойство hibernate.query.factory_class
значение
От
org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory
к
org.hibernate.hql.ast.ASTQueryTranslatorFactory
Смотрите больше forum.hibernate.org
Примечание
использование Query.setParameter()
метод передачи параметра в запрос
Query updateQuery = session.createQuery("update User set registered = '1'
where user_activation_key = :userUUID");
updateQuery.setParameter("userUUID", userUUID);
HQL использует имя класса вместо имени таблицы и имена свойств вместо имени столбца. Я думаю, что ваша проблема связана с этим.
Вы также импортируете правильный запрос?
Hibernate предоставляет два вида реализации парсера HQL
- org.hibernate.hql.classic.ClassicQueryTranslatorFactory
- org.hibernate.hql.ast.ASTQueryTranslatorFactory
и мы упоминаем, что в нашем файле конфигурации "hibernate.cfg.xml", как показано ниже
<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
Или же
<property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>
Эта конфигурация является необязательной, если вы не настроите реализацию синтаксического анализатора HQL явно, то вашей реализацией синтаксического анализатора HQL по умолчанию будет org.hibernate.hql.ast.ASTQueryTranslatorFactory. Чтобы решить эту проблему, удалите запись hibernate.query.factory_class из файла hibernate.cfg.xml, чтобы hibernate мог использовать реализацию синтаксического анализатора HQL по умолчанию, или измените ее на org.hibernate.hql.ast.ASTQueryTranslatorFactory из org.hibernate..hql.classic.ClassicQueryTranslatorFactory.