代码之家  ›  专栏  ›  技术社区  ›  Tadeusz Kopec for Ukraine yespbs

在休眠中大容量删除时出现查询语法错误

  •  2
  • Tadeusz Kopec for Ukraine yespbs  · 技术社区  · 15 年前

    我尝试使用hibernate hql查询执行批量删除,如下 reference manunal 但我得到一个查询语法错误。这条线

    final Query qry = getSession(false).createQuery(" delete from NewCalendarDay");
    

    导致异常:

    org.hibernate.queryexception:查询必须以select或from:delete[从pl.com.bms.avaro.staticdata.model.newcalendarday删除]

    执行代码的类扩展 org.springframework.orm.hibernate3.support.HibernateDaoSupport 如此 getSession() 方法应返回 org.hibernate.Session . 我使用的是Spring v.2.5.5和Hibernate v.3.2.6.ga。

    我应该配置一些能够批量删除的内容吗?

    编辑
    Bozho要求完整的堆栈跟踪,所以这里是:

    org.hibernate.QueryException: query must begin with SELECT or FROM: delete [ delete from pl.com.bms.avaro.staticData.model.NewCalendarDay ]
        at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:83)
        at org.hibernate.hql.classic.PreprocessingParser.token(PreprocessingParser.java:108)
        at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:28)
        at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:216)
        at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:185)
        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)
        at pl.com.bms.avaro.staticData.dao.implementations.NewCalendarDayDaoImpl.deleteCalendarDaysForYear(NewCalendarDayDaoImpl.java:41)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy43.deleteCalendarDaysForYear(Unknown Source)
        at pl.com.bms.avaro.staticData.dao.tests.TestCalendarDayDaoImpl.testFindByDateCal(TestCalendarDayDaoImpl.java:60)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at junit.framework.TestCase.runTest(TestCase.java:168)
        at junit.framework.TestCase.runBare(TestCase.java:134)
        at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76)
        at junit.framework.TestResult$1.protect(TestResult.java:110)
        at junit.framework.TestResult.runProtected(TestResult.java:128)
        at junit.framework.TestResult.run(TestResult.java:113)
        at junit.framework.TestCase.run(TestCase.java:124)
        at junit.framework.TestSuite.runTest(TestSuite.java:232)
        at junit.framework.TestSuite.run(TestSuite.java:227)
        at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:91)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    
    2 回复  |  直到 15 年前
        1
  •  8
  •   Bozho    15 年前

    先摆脱领先的空白。然后使用执行查询 query.executeUpdate()

    那么,即使这对您有效,我也不会建议使用hql删除实体。如果它们之间存在任何关系,这些关系将不会层叠,最终会导致不一致。

    选择所有对象并调用 session.remove(entity) 在每一个。当然,如果您没有任何x对x关系,可以继续使用hql,但是在将来添加这样的关系时要小心。

    更新: 在休眠配置中,您可能会遇到类似的情况:

    <prop
     key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory
    </prop>
    

    它使Hibernate使用经典的解析器。请将其删除并重试。

        2
  •  0
  •   Arno    7 年前

    我也有同样的错误,我要评论这个属性 org.hibernate.hql.internal.classic.classicquerytranslatorfactory</property-->

    解决问题。