java - 删除查询时 Hibernate 版本更新后子树意外结束异常

标签 java sql hibernate jpa

当我从表中删除所有数据时出现奇怪的异常。自从我将 Hibernate 版本从 3.x.x 更新到 4.2.6 后出现异常。

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

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

堆栈跟踪:

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

当我向删除查询添加 where 子句时,不会发生异常。

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

但我不认为 Hibernate 有这个意图。

我已经检查了以下主题:

有人知道如何解决这个问题吗?

最佳答案

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

您可以找到 patch如果您还没有准备好升级到 4.2.7,请访问 GitHub。

关于java - 删除查询时 Hibernate 版本更新后子树意外结束异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19381040/

相关文章:

java - 第 K 个最小数算法做额外的工作?

java - 无法在 eclipse mars 中更改动态 Web 模块 3.1

sql - 是否可以使用sql实现DFS(深度优先搜索)?

mysql - 在对一列(或一组列)A进行分组时,如何获取每组A中一列(或一组列)B的最常见值?

java - 从多个线程发布到 KDB

java - 为什么使用静态方法不利于单元测试?

mysql - sql语句复杂条件 "join"

java - 如何将参数传递给回调方法

java - hibernate 映射异常 :Unknown entity don't know why?

java - 如果更新的客户端请求中不存在保存的对象,是否可以删除数据库条目?