簡體   English   中英

如何使用where子句中具有parent屬性的hibernate查詢來更新數據

[英]how to update data using hibernate query having parent property in where clause

我正在使用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;
    }

當我在這樣的hibernate中使用select查詢時

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

它工作正常,但當我在這樣的hibernate中使用更新查詢

    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)

難道我做錯了什么?

檢查你是否有吸氣劑和二傳手。
如果name在數據庫中,也使用注釋@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

我找到了答案。

根據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)"

獲取一個對象並嘗試修改其值並進行更新。

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

如果您確定獲得一個且只有一個被更新,請使用此選項。 另外,您可以根據您的要求實施此功能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM