Java 如何使用where子句中具有父属性的hibernate查询更新数据

Java 如何使用where子句中具有父属性的hibernate查询更新数据,java,oracle,hibernate,Java,Oracle,Hibernate,我正在使用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 hq

我正在使用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"
当我像这样在hibernate中使用select查询时

    @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"
它很好用 但是当我像这样在hibernate中使用更新查询时

    @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)

我做错什么了吗?

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

@Entity
    public class Student{
    @Id
    Long id;
    @Column(name="studentName")
    String name;
    }
如果您有一些未映射到数据库表的“标识标志”,请使用
@Transient
,这意味着:

我找到了答案

在批量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)"

获取一个对象并尝试修改其值并更新它

Query q=session.createQuery(“from-Exam-Exam-where-Exam.student.name=:name”);
q、 setParameter(“名称”、“xyz”)
检查检查=(检查)q.list().get(0)

考试。状态(“完成”)
更新(考试)


如果您确定您得到一个且只有一个记录要更新,请使用此选项。您还可以在您的需求中使用它来实现状态字段映射到任何内容吗?您是否尝试过更新考试集考试。状态=:状态where-Exam.student.name=:name
?不。它没有映射到任何内容。sanbhat:是的,我尝试过了。