2010-02-22 6 views
2

J'essaye de supprimer en bloc l'exécuteur à l'aide de la requête Hibernate HQL, en suivant reference manunal mais j'obtiens une erreur de syntaxe de requête. Cette ligneErreur de syntaxe de requête lors de la suppression en bloc dans Hibernate

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

fait exception:

org.hibernate.QueryException: requête doit commencer par SELECT ou FROM: supprimer [supprimer pl.com.bms.avaro.staticData.model.NewCalendarDay]

classe où le code est exécuté étend org.springframework.orm.hibernate3.support.HibernateDaoSupport, si la méthode getSession() doit retourner org.hibernate.Session. J'utilise spring v. 2.5.5 et Hibernate v. 3.2.6.ga

Dois-je configurer quelque chose pour pouvoir supprimer en bloc ou quoi?

EDIT
Bozho demandé trace complète de la pile, donc voilà:

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) 
+0

Vous pouvez voir ce pour une meilleure anderstanding [http://stackoverflow.com/questions/9909709/hibernate-classicquerytranslatorfactory-vs-astquerytranslatorfactory][1] [1]: http: // stackoverflow.com/questions/9909709/hibernate-classicquerytranslatorfactory-vs-astquerytranslatorfactory – Nehemia

Répondre

8

Débarrassez des principaux espaces pour commencer. Ensuite, exécutez la requête en utilisant

Ensuite, même si cela fonctionne pour vous, je ne conseillerais pas d'utiliser HQL pour supprimer des entités. Dans le cas où ils ont des relations, ceux-ci ne seront pas cascadés et vous vous retrouverez avec des incohérences.

Sélectionnez tous les objets et appelez session.remove(entity) sur chacun. Bien sûr, si vous n'avez pas de relations x-to-x, vous pouvez procéder avec le HQL, mais faites attention si vous ajoutez un tel dans le futur.

Mise à jour: vous pourriez avoir quelque chose comme ceci dans vos configurations de mise en veille prolongée:

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

Il fait Hibernate utiliser l'analyseur classique. Retirez-le et réessayez.

+0

La suppression des espaces de fin n'a pas aidé. L'interface org.hibernate.Session ne définit pas la méthode executeUpdate, donc je ne peux pas l'utiliser. Je sais que l'optimisation prématurée est une racine de tous les maux, mais je pense que le fait de charger des objets uniquement pour les supprimer est un gaspillage de ressources. Et je ne comprends pas comment un code presque copié à partir du manuel de référence peut échouer de cette façon. –

+0

@Tadeusz Kopec désolé, je voulais utiliser la méthode 'executeUpdate' de l'objet' Query'. S'il vous plaît donner l'ensemble stacktrace. – Bozho

+0

Ajouté stacktrace à la question.Pour exécuter la requête je dois d'abord la créer, mais la création échoue :-) –

0

J'ai la même erreur et de commenter cette propriété org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory </propriété ->

résout le problème.

+0

Voir la section mise à jour dans la réponse de @ bozho. –

Questions connexes