2012-05-06 6 views
1

多くのトラブルの後、私のwebappは最終版に近いですが、まだ何かが必要です。EJBクエリを使用してMySqlルーチン/ストアドプロシージャを呼び出す

私はいくつかの結果を取得するために "複雑な"クエリを使用する必要があります。

このクエリは、MySqlルーチンを呼び出す必要があり、Listの代わりにMapを返す必要があります。

ここでは、クエリです:

SELECT d.id, contaOccorrenze(d.descrizione, '" + query + "') AS 'occorrenze' FROM Dispensa d WHERE d.tag LIKE '%" + query + "%' OR d.titolo LIKE '%" + query + "%' OR d.descrizione LIKE '%" + query + "%' 

queryは私が探している単語であるとcontaOccorrenzeは私が呼び出す必要がルーチンです。

このクエリはWorkbenchで正常に動作します。したがって、クエリは私の問題ではありません。

ここで私は、クエリを実行しようとした後に来るスタックトレースです:

Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing the query [SELECT d.id, contaOccorrenze(d.descrizione, 'lunga') AS 'occorrenze' FROM Dispensa d WHERE d.tag LIKE '%lunga%' OR d.titolo LIKE '%lunga%' OR d.descrizione LIKE '%lunga%'], line 1, column 28: unexpected token [(]. 
Internal Exception: NoViableAltException([email protected][()* loopback of 383:9: (d= DOT right= attribute)*]) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1477) 
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createQuery(EntityManagerWrapper.java:436) 
    at facade.DispensaFacade.findLikeComplex(DispensaFacade.java:101) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) 
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388) 
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) 
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144) 
    at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) 
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370) 
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5360) 
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214) 
    ... 77 more 
Caused by: Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query [SELECT d.id, contaOccorrenze(d.descrizione, 'lunga') AS 'occorrenze' FROM Dispensa d WHERE d.tag LIKE '%lunga%' OR d.titolo LIKE '%lunga%' OR d.descrizione LIKE '%lunga%'], line 1, column 28: unexpected token [(]. 
Internal Exception: NoViableAltException([email protected][()* loopback of 383:9: (d= DOT right= attribute)*]) 
    at org.eclipse.persistence.exceptions.JPQLException.unexpectedToken(JPQLException.java:372) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.handleRecognitionException(JPQLParser.java:320) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.addError(JPQLParser.java:246) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.reportError(JPQLParser.java:363) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.pathExprOrVariableAccess(JPQLParser.java:1436) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.arithmeticPrimary(JPQLParser.java:4720) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.arithmeticFactor(JPQLParser.java:4660) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.arithmeticTerm(JPQLParser.java:4546) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.simpleArithmeticExpression(JPQLParser.java:4462) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.scalarExpression(JPQLParser.java:4834) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectExpression(JPQLParser.java:1269) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectItem(JPQLParser.java:1169) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectClause(JPQLParser.java:1108) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectStatement(JPQLParser.java:359) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.document(JPQLParser.java:281) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.parse(JPQLParser.java:134) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.buildParseTree(JPQLParser.java:95) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:215) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:190) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:142) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:126) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1475) 
    ... 100 more 
Caused by: NoViableAltException([email protected][()* loopback of 383:9: (d= DOT right= attribute)*]) 
    at org.eclipse.persistence.internal.libraries.antlr.runtime.DFA.noViableAlt(DFA.java:159) 
    at org.eclipse.persistence.internal.libraries.antlr.runtime.DFA.predict(DFA.java:116) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.pathExprOrVariableAccess(JPQLParser.java:1408) 
    ... 117 more 

ここで私はHashMapに結果Listをキャスト(使用しようとしている完全な方法ですが私が見つけた方法ですグーグルで、私は)私のクエリから

public HashMap<Integer, Integer> findLikeComplex(String query) { 
     String SQLquery = "SELECT d.id, contaOccorrenze(d.descrizione, '" + query + "') AS 'occorrenze' FROM Dispensa d WHERE d.tag LIKE '%" + query + "%' OR d.titolo LIKE '%" + query + "%' OR d.descrizione LIKE '%" + query + "%'"; 
     return (HashMap<Integer, Integer>) getEntityManager().createQuery(SQLquery).getResultList();   
    } 

私もHashMap<Integer, Integer>から私のHashMapを変更するために考えていたがHashMapを得るためのより良い方法があることをかなり確信していますクエリのd.idステートメントを*に変更して、HashMap<Dispensa, Integer>を追加します。

それはうまくいくのですか、それともあまりにも多くのことを聞いていますか?

答えて

2

試してみるgetEntityManager().createNativeQuery()

+0

これは機能します。 つまり、クエリを実行しますが、 'Vector'を' HashMap'にキャストできないという例外がスローされます(これはかなり明白です)。 このクエリは 'List'の代わりに' Map'を返すことができますか? – StepTNT

+1

あなたはできません。だから結果をループしてマップに追加する必要があります。 – barsju

+0

解決済み。 'getResultList()'はこの場合は 'List 'を返します:) – StepTNT

関連する問題