2013-05-08 83 views
0

我使用Hibernate的Java Web应用程序的工作和oracle.I当我像Hibernate使用select查询设定了两个实体这样使用在where子句

@Entity 
    public class Student{ 
    @Id 
    Long id; 
    String name; 
    } 

    @Entity 
    public class Exam{ 
    @Id 
    Long id; 
    String status; 
    @ManyToOne 
    Student student; 
    } 

parent属性Hibernate查询如何更新数据这

String hql="from Exam exam where exam.student.name=:name" 

它工作正常 但是当我使用更新查询休眠这样

String hql="update Exam exam set status=:status where exam.student.name=:name" 

它产生以下错误

org.hibernate.exception.SQLGrammarException: ORA-00971: missing SET keyword 

at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:122) 
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) 
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 
at $Proxy154.executeUpdate(Unknown Source) 
at org.hibernate.hql.internal.ast.exec.BasicExecutor.execute(BasicExecutor.java:103) 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:413) 
at org.hibernate.engine.query.spi.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:282) 
at org.hibernate.internal.SessionImpl.executeUpdate(SessionImpl.java:1267) 
at org.hibernate.internal.QueryImpl.executeUpdate(QueryImpl.java:116) 

我做错了什么?

+0

是状态字段映射到任何东西? – Adarsh 2013-05-08 09:09:55

+0

你试过'更新考试考试集exam.status =:状态where exam.student.name =:name'? – sanbhat 2013-05-08 09:11:06

+0

没有。它没有映射到任何东西。 – Dipesh 2013-05-08 09:11:28

回答

1

我找到了答案。

根据http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html#batch-direct

没有加入,无论是隐性或显性的,可以在大批量HQL语句中指定。子查询可以用在where子句中,其中子查询本身可以包含连接。

所以要解决我的问题,我更新了我的查询

String hql = "update Exam exam set exam.status=:status where exam.id in(select e.id from Exam e where e.student.name=:name)" 
0

获取一个对象,并尝试修改其价值并进行更新。

Query q = session.createQuery("from Exam exam where exam.student.name=:name"); q.setParameter("name", "xyz");
Exam exam = (Exam)q.list().get(0);

exam. status("completed");
session.update(exam);

使用这个,如果你确信你得到一个也是唯一一个向条记录进行更新。其他明智的,你可以实现使用此为您的要求