2012-09-04 13 views
5

मैं hsqldb और हाइबरनेट का उपयोग कर एक क्वेरी कर रहा हूं। मैं बयान से कोई ऐसा आदेश है: -एचएसक्यूएलडीबी ऑर्डर एकाधिक कॉलम के साथ

Query query = em 
    .createQuery("SELECT DISTINCT new com.mytransferobject.QuickSearchResultTO(m.id, m.firstName||' '||m.surname, '') " + 
     "FROM Member m, ClassC c, ClassCm cm " + 
     "WHERE c.id = cm.clubId AND m.id = cm.memberId " + 
     "AND c.lft >= :lft AND c.lft <= :rgt " + 
     "AND (firstName LIKE :memberName OR surname LIKE :memberName) " + 
     "AND m.deleted = false " + 
     "AND c.deleted = false " + 
     "ORDER BY m.firstName, m.surname"); 

query.setParameter("lft", lft); 
query.setParameter("rgt", rgt); 
query.setParameter("memberName", memberName + "%"); 

यह MYSQL में ठीक काम करता है, लेकिन अपने परीक्षण कोड में विफल रहता है (HSQLDB 2.2.6 का उपयोग)। मैंने उन्हें एक साथ जोड़ने की कोशिश की और यह ठीक काम करता है, लेकिन यह एक अत्यधिक उपयोग की गई क्वेरी है, इसलिए मैं किसी भी अनावश्यक परिचालन से बचना चाहता हूं।

मैं एक अपवाद हो रही है: -

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: invalid ORDER BY expression 
     at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1360) 
     at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1288) 
     at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:261) 
     at com.servasport.smp.dao.jpa.MemberDaoImpl.quickSearchAll(MemberDaoImpl.java:626) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
     at $Proxy68.quickSearchAll(Unknown Source) 
     at com.servasport.smp.dao.MemberDaoTest.quickSearchSuccess(MemberDaoTest.java:768) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
     at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
     at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
     at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
     at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
     at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
     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) 
    Caused by: org.hibernate.exception.SQLGrammarException: invalid ORDER BY expression 
     at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:83) 
     at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
     at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 
     at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 
     at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.continueInvocation(ConnectionProxyHandler.java:146) 
     at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 
     at $Proxy95.prepareStatement(Unknown Source) 
     at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:147) 
     at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:166) 
     at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:145) 
     at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1720) 
     at org.hibernate.loader.Loader.doQuery(Loader.java:828) 
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) 
     at org.hibernate.loader.Loader.doList(Loader.java:2447) 
     at org.hibernate.loader.Loader.doList(Loader.java:2433) 
     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2263) 
     at org.hibernate.loader.Loader.list(Loader.java:2258) 
     at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470) 
     at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) 
     at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:196) 
     at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1161) 
     at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 
     at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:252) 
     ... 43 more 
    Caused by: java.sql.SQLSyntaxErrorException: invalid ORDER BY expression 
     at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
     at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
     at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source) 
     at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.continueInvocation(ConnectionProxyHandler.java:138) 
     ... 61 more 
    Caused by: org.hsqldb.HsqlException: invalid ORDER BY expression 
     at org.hsqldb.error.Error.error(Unknown Source) 
     at org.hsqldb.error.Error.error(Unknown Source) 
     at org.hsqldb.QuerySpecification.resolveGroups(Unknown Source) 
     at org.hsqldb.QuerySpecification.resolveTypesPartTwo(Unknown Source) 
     at org.hsqldb.QueryExpression.resolve(Unknown Source) 
     at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source) 
     at org.hsqldb.ParserCommand.compilePart(Unknown Source) 
     at org.hsqldb.ParserCommand.compileStatement(Unknown Source) 
     at org.hsqldb.Session.compileStatement(Unknown Source) 
     at org.hsqldb.StatementManager.compile(Unknown Source) 
     at org.hsqldb.Session.execute(Unknown Source) 
     ... 68 more 
+0

यह कैसे विफल हो जाता है? कोई अपवाद स्टैक ट्रेस? आप इसे क्या करना चाहते हैं, और इसके बजाय यह क्या करता है? –

+0

आप कौन सी क्वेरी कर रहे हैं? विफलता क्या है? 'प्रथम नाम से ऑर्डर, उपनाम' एचएसक्यूएलडीबी द्वारा समर्थित है। – fredt

+0

क्षमा करें एक बैठक में था, मैंने अभी अपवाद जोड़ा है। मैंने 2.2.8 (मेवेन पर नवीनतम) को अपडेट करने का प्रयास किया, लेकिन उसी अपवाद –

उत्तर

6

शायद, आप एक अपवाद "अभिव्यक्ति द्वारा अमान्य आदेश" क्योंकि आप द्वारा (आपके मामले में, m.firstName और m.surname क्रम में एक स्तंभ निर्दिष्ट है) जो चयन खंड में स्पष्ट रूप से वापस नहीं आ रहे हैं। कुछ डेटाबेस, जैसे कि SQL सर्वर और MySQL को इसकी आवश्यकता नहीं है, लेकिन HSQLDB और DB2 जैसे अन्य लोग भी चयन में फ़ील्ड के बिना यह आदेश नहीं कर सकते हैं।

मुझे लगता है कि अगर आप का उपयोग अपने कोड काम करेगा:

Query query = em 
    .createQuery("SELECT DISTINCT new com.mytransferobject.QuickSearchResultTO(m.id, m.firstName, m.surname, m.firstName||' '||m.surname, '') " + 
     "FROM Member m, ClassC c, ClassCm cm " + 
     "WHERE c.id = cm.clubId AND m.id = cm.memberId " + 
     "AND c.lft >= :lft AND c.lft <= :rgt " + 
     "AND (firstName LIKE :memberName OR surname LIKE :memberName) " + 
     "AND m.deleted = false " + 
     "AND c.deleted = false " + 
     "ORDER BY m.firstName, m.surname"); 
0

मैं एक ही मुद्दा था, मैं इसे DISTINCT के बजाय द्वारा समूह का उपयोग करके तय है, यह एक ही परिणाम लौटने। यदि आप उपयोग करते हैं तो आपका कोड काम करेगा:

Query query = em 
.createQuery("SELECT new com.mytransferobject.QuickSearchResultTO(m.id, m.firstName||' '||m.surname, '') " + 
    "FROM Member m, ClassC c, ClassCm cm " + 
    "WHERE c.id = cm.clubId AND m.id = cm.memberId " + 
    "AND c.lft >= :lft AND c.lft <= :rgt " + 
    "AND (firstName LIKE :memberName OR surname LIKE :memberName) " + 
    "AND m.deleted = false " + 
    "AND c.deleted = false " + 
    "GROUP BY m.idORDER BY m.firstName, m.surname");