在删除查询的Hibernate版本更新后,意外的子树异常结束 [英] unexpected end of subtree exception after Hibernate version update on delete query

查看:110
本文介绍了在删除查询的Hibernate版本更新后,意外的子树异常结束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我删除表中的所有数据时,我收到一个奇怪的异常。在我将Hibernate版本从3.xx更新到4.2.6后发生异常。



我调用的从表中删除数据的Dao方法:

  @覆盖
公共无效deleteAll()
{
的EntityManager EM = getEntityManager();
em.createQuery(DELETE Document).executeUpdate();
}

Stacktrace:

  12:46:03570 ERROR ErrorCounter:50  - < AST>:0:0:子树
将意外结束; AST>:0:0:子树的意外的结束
at org.hibernate.hql.internal.antlr.SqlGeneratorBase.whereClauseExpr(SqlGeneratorBase.java:1378)
at org.hibernate.hql.internal.antlr.SqlGeneratorBase.whereClause(SqlGeneratorBase.java:1272)
at org.hibernate.hql.internal.ast.exec.DeleteExecutor。< init>(DeleteExecutor.java:72)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.buildAppropriateStatementExecutor(QueryTranslatorImpl .java:535)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:201)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl的.java:;初始化> 138)LT
。在org.hibernate.engine.query.spi.HQLQueryPlan&(HQLQueryPlan.java:105)
。在org.hibernate.engine.query.spi.HQLQueryPlan。 < INIT>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221)
org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1778)
at org.hibernate.ejb.AbstractEntityManagerImpl .createQuery(AbstractEntityManagerImpl.java:291)
at sun.reflect.GeneratedMethodAccessor800.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java .lang.reflect.Method.invoke(Method.java:606)

实体:



pre $ @Entity
@Table(name =document)
public class Document实现Serializable
{
@Override
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name =document_id)
private int ID;

私有字符串文件名;

@Temporal(TemporalType.TIMESTAMP)
@Column(name =file_modified_time)
私人日期fileModifiedTime;

@ManyToOne(取= FetchType.LAZY)
@JoinColumn(名称= attached_to_Task_fk)
私人任务attachedToTaskFk;

// Getter / Setter
}

当我添加


$ b

  em.createQuery(DELETE Document d WHERE d。)删除查询的where子句时,不会发生异常。 id> 0).executeUpdate(); 

但我不认为Hibernate是这样想的。



我已经检查了以下主题:



<有没有人有任何想法如何解决这个问题?

解决方案

这似乎是一个 Hibernate bug在4.2.7和4.3.0.Beta5中修复。该DeleteExecutor以前需要Where子句。



您可以找到的修补程序


I get a strange exception when I delete all data from a table. The exception occurs since I updated the Hibernate version from 3.x.x to 4.2.6.

the Dao method that I call to delete the data from the table:

  @Override
  public void deleteAll()
  {
     EntityManager em = getEntityManager();
     em.createQuery( "DELETE Document" ).executeUpdate();
  }

Stacktrace:

12:46:03,570 ERROR ErrorCounter:50 - <AST>:0:0: unexpected end of subtree
<AST>:0:0: unexpected end of subtree
at org.hibernate.hql.internal.antlr.SqlGeneratorBase.whereClauseExpr(SqlGeneratorBase.java:1378)
at org.hibernate.hql.internal.antlr.SqlGeneratorBase.whereClause(SqlGeneratorBase.java:1272)
at org.hibernate.hql.internal.ast.exec.DeleteExecutor.<init>(DeleteExecutor.java:72)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.buildAppropriateStatementExecutor(QueryTranslatorImpl.java:535)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:201)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:138)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1778)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291)
at sun.reflect.GeneratedMethodAccessor800.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)

Entity:

@Entity
@Table( name = "document" )
public class Document implements Serializable
{
  @Override
  @Id
  @GeneratedValue( strategy = GenerationType.IDENTITY )
  @Column( name = "document_id" )
  private int           id;

  private String                 filename;

  @Temporal( TemporalType.TIMESTAMP )
  @Column( name = "file_modified_time" )
  private Date                   fileModifiedTime;

  @ManyToOne( fetch = FetchType.LAZY )
  @JoinColumn( name = "attached_to_Task_fk" )
  private Task       attachedToTaskFk;

 //Getter/Setter
}

When I add a where clause to the delete query, the exception doesn't occur.

em.createQuery( "DELETE Document d WHERE d.id > 0" ).executeUpdate();

But I don't think that Hibernate intended it this way.

I already checked following topics:

Has anyone any idea how to fix this?

解决方案

This appears to be a Hibernate bug that is fixed in 4.2.7 and 4.3.0.Beta5. The DeleteExecutor previously required a Where clause.

You can find the patch on GitHub if you're not ready to upgrade to 4.2.7.

这篇关于在删除查询的Hibernate版本更新后,意外的子树异常结束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆