【问题标题】:hql update query for one property一个属性的 hql 更新查询
【发布时间】:2012-12-29 17:19:40
【问题描述】:

我遇到了非常奇怪的问题,找不到解决方法。我在 intellij 的 HQL 控制台中编写了以下 HQL

update NewsEntity ne set ne.main=false where ne.main=true

堆栈跟踪

java.lang.IllegalArgumentException: node to traverse cannot be null!
 at org.hibernate.hql.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:31)
 at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:254)
 at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157)
 at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
 at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
 at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
 at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
 at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
 at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
 at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
 in RemoteSessionImpl.createQuery(RemoteSessionImpl.java:50)
 in RemoteUtil.executeWithClassLoader(RemoteUtil.java:122)
 in RemoteUtil$2$1.invoke(RemoteUtil.java:81)
 in HibernateEngine.createQuery(HibernateEngine.java:142) 

当我编写delete 查询时,我没有遇到同样的问题。

我基于以下文章 HQL update query 进行了此查询。但是,似乎无法弄清楚为什么我仍然遇到这个问题。

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    Hibernate 这样的 ORM 的想法是避免此类更新查询。 您只需从 db 加载对象,更改字段,然后 Hibernate 将更新对象为 out。

    Query query = session.createQuery("from NewsEntity ne where ne.main = true");
    NewsEntity newsEntity = (NewsEntity) query.uniqueResult();
    newsEntity.setMain=false;
    //Hibernate will update the object
    

    如果有更多对象:

    List<NewsEntity> newsEntities = (List<NewsEntity>) query.list();
    for(NewsEntity entity : newsEntities)
    {
     entity.setMain=false;
    }
    

    Hibernate 还支持 DML 语句,因此要执行 update 查询,您应该这样做:

    Query query = session.createQuery("your update query");
    int result = query.executeUpdate();
    

    【讨论】:

    • @Antropo 好的。但我没有uniqueResult。此表中除一条以外的所有记录都不是主要记录。我不敢相信如果我想更改所有记录的一个属性。我应该获取记录,更改每个循环的属性并保存
    • uniqueResult() 更改为list() 并循环更新所有对象。
    • @Antropo 我知道如果我有列表,我会在循环中更改属性 OK,但这意味着我不是在 db 上分配此任务,而是手动并循环执行。它比在 db 中的简单查询需要更多时间。如果我有 10000 条记录...
    • 我更新了答案,查看manual 以获取 HQL 中的批量更新
    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多