Note that there are some explanatory texts on larger screens.

plurals
  1. POCalling a MySql routine/stored procedure with an EJB Query
    primarykey
    data
    text
    <p>After a lot of troubles, my webapp is close to its final version, but it still needs something.</p> <p>So I need to use a "complex" query to fetch some results.</p> <p>This query needs to call a MySql routine and has to return a <code>Map</code> instead of a <code>List</code>.</p> <p>Here's the query :</p> <pre><code>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 + "%' </code></pre> <p>where <code>query</code> is the word that I'm looking for and <code>contaOccorrenze</code> is the routine that I need to call.</p> <p>This query works fine in Workbench, so the query is not my problem.</p> <p>Here's the Stack Trace that comes after I try to execute the query :</p> <pre><code> 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(83@[()* 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(83@[()* 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.&lt;init&gt;(EJBQueryImpl.java:142) at org.eclipse.persistence.internal.jpa.EJBQueryImpl.&lt;init&gt;(EJBQueryImpl.java:126) at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1475) ... 100 more Caused by: NoViableAltException(83@[()* 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 </code></pre> <p>Here's the full method that I'm trying to use (casting the result <code>List</code> to a <code>HashMap</code> is a way that I found googling, but I'm quite sure that there's a better way to get a <code>HashMap</code> from my query)</p> <pre><code>public HashMap&lt;Integer, Integer&gt; 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&lt;Integer, Integer&gt;) getEntityManager().createQuery(SQLquery).getResultList(); } </code></pre> <p>I was also thinking to change my <code>HashMap</code> from <code>HashMap&lt;Integer, Integer&gt;</code> to <code>HashMap&lt;Dispensa, Integer&gt;</code>, by changing the <code>d.id</code> statement of the query to <code>*</code>.</p> <p>Will it work or I'm asking too much?</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload