Java HQL更新有问题

Java HQL更新有问题,java,hibernate,Java,Hibernate,当我尝试执行以下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.QueryExcepti

当我尝试执行以下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.QueryException: query must begin with SELECT or FROM: update.....
编辑:
我也试过跟随,但也不行

org.hibernate.Query  query =  getSession().createQuery("update XYZ t set t.status = 10");
编辑2: 在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>
org.hibernate.hql.ast.ASTQueryTranslatorFactory
这不是HQL查询。 您想要导入允许普通sql的
javax.persistence.Query
, 不
org.hibernate.Query
在其上工作

如果要使用简单sql,还可以使用

但是,如果您真的想使用hibernate,而不利用entityobjects(完全违背了使用hibernate的初衷,imho),您可以这样做():

尝试:

再看一看

对于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。

问题是在SQL中思考,而您应该在对象中思考:

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

hibernate.cfg.xml
文件中解决异常:

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

看一看,它看起来像批量更新,因此您的问题非常有趣。请关闭createQuery中的引号。(与问题无关)@ALL:问题是由于我的编辑2中提到的某些休眠属性造成的。为什么会这样?有人能澄清吗?很好。对于这一点,我也会选择createSQLQuery.+1,尽管我不同意您关于使用Hibernate的观点。在我看来,有时候你只需要做一些批量操作。如果对象发生更改,将命名查询放置在适当的文件中将阻止休眠启动。所以你会修好的。不要忘记批量更新,直到执行它们为止。@Udo Fholl True,但这只是一个简单的更新-不是批量操作。我得到的印象是NamedQuery超出了这个问题的范围。@Nimchimpsky:我尝试了我上次编辑中提到的方法,但它不起作用。@akshay,在你的问题中,你列出了一个与我的typeddoes不同的查询,我想你必须提供命名参数,然后设置?如果有命名参数,则必须添加该参数。@all:我在最近一次编辑中提到过您的方法,但它不起作用这里没有将“活动”引用为pojo;我觉得这令人困惑。您必须提供命名参数,然后设置using hibernate?Activity是我的POJO的名称,是的,它还命名了参数“taskstartedOn”和“taskId”。“startedOn”和“id”是POJO的属性。POJO在代码段中的任何地方都没有使用,第二条sql语句没有使用命名参数。好的,我已经删除了第二条stmt
hibernate.query.factory_class = org.hibernate.hql.ast.ASTQueryTranslatorFactory
org.hibernate.QueryException: query must begin with SELECT or FROM: update.....