0

私は休止状態とオラクルを使用してJava Webアプリケーションに取り組んでいます。このような2つのエンティティを設定しました

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

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

このように休止状態で選択クエリを使用すると

    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)

私は何か間違ったことをしていますか?

4

3 に答える 3

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)"
于 2013-05-08T10:12:31.217 に答える
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);

更新する記録を 1 つだけ取得することが確実な場合は、これを使用してください。それ以外の場合は、要件に合わせてこれを使用して実装できます

于 2013-09-23T05:43:54.803 に答える