2013-05-08 84 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);

使用這個,如果你確信你得到一個也是唯一一個向條記錄進行更新。其他明智的,你可以實現使用此爲您的要求