0

我正在使用 hibernate 和 oracle 开发 java web 应用程序。我已经设置了两个这样的实体

    @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 回答
1

检查你是否有getter和setter。如果名称在数据库中,
也使用注释:@Column

@Entity
    public class Student{
    @Id
    Long id;
    @Column(name="studentName")
    String name;
    }

如果您有一些未映射到数据库表的“标识标志”,请使用@Transient这意味着:http ://docs.oracle.com/javaee/5/api/javax/persistence/Transient.html

于 2013-05-08T09:22:03.133 回答
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);

如果您确定您只有一个记录要更新,请使用此选项。否则,您可以根据您的要求使用它来实现

于 2013-09-23T05:43:54.803 回答