【发布时间】:2013-10-23 05:55:12
【问题描述】:
当我从表中删除所有数据时,我遇到了一个奇怪的异常。发生异常是因为我将 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.atlassian.net/browse/HHH-8603
-
你试过降级升级hibernate版本吗?
-
您是否尝试将查询放入 NamedQuery 中?
-
@Andrei:NamedQuery 不起作用。降级到Hibernate 4.1.9版本不会出现异常。