[ 
https://issues.apache.org/jira/browse/OPENJPA-1781?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Catalina Wei resolved OPENJPA-1781.
-----------------------------------

    Resolution: Not A Problem

Hi Kai,
1. JPQL syntax does not support count(*) syntax. Therefore, 
You can rewrite it as count(p) in your JPQL string as below :

       select count(p) from PersonDb p where p.objectId in (select 
f.friend.objectId from PersonDb p, FriendDb f where p.objectId = 
f.person.objectId and p.id in (?1))

This would generate SQL COUNT on primary keys of PersonDb table. 
For example, if primary key  column is "ID",  then   COUNT(t0.ID) ... should be 
generated in SQL pushdown.

2. When DBDictionary property  value  "useWildCardForCount " is specified, it 
only affects SQL pushdown. 
For the above JPQL query string,  if "userWildCardForCount" is specified, then 
COUNT(*) is generated in SQL pushdown  in stead of COUNT(t0.ID).
"useWildCardForCount" has no effect on JPQL parser.

3. JPQLUtil.java is  from OpenSocial - that is not OpenJPA:
org.apache.shindig.social.opensocial.jpa.spi.JPQLUtils.createQuery(JPQLUtils.java:112)
Please verify the source and get help there.

Catalina

> OpenJPA 2.0 supports count(*) or not?
> -------------------------------------
>
>                 Key: OPENJPA-1781
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1781
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: query
>    Affects Versions: 2.0.0
>         Environment: JDK 1.6, OpenJPA 2.0, Shindig 2.0
>            Reporter: Kai Feng Zhang
>            Priority: Critical
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> Today I encountered a jpql parse exception thrown from openjpa 2.0. I 
> searched here and found some links talking about count(*), but seems 2.0 
> still has such issue.
> https://issues.apache.org/jira/browse/OPENJPA-566
> https://issues.apache.org/jira/browse/OPENJPA-1440
> My select statement is: "select count(*)  from PersonDb p where p.objectId in 
> (select f.friend.objectId from PersonDb p, FriendDb f where p.objectId = 
> f.person.objectId and p.id in (?1)) ".
> In JPQLParser.java, it will parse this jpql, and then throw exception:
>   
>       public Object parse(String ql, ExpressionStoreQuery query) {
>         if (query.getContext().getParameterDeclaration() != null)
>             throw new UserException(_loc.get("param-decs-invalid"));
>         try {
>               return new JPQLExpressionBuilder.ParsedJPQL(ql);
>         } catch (ParseException e) {
>               throw new ParseException(_loc.get("jpql-parse-error", 
>                       ql, e.getMessage()).getMessage(), e);
>         }
>     }
> Exception stack is here:
> <openjpa-2.0.0-r422266:935683 nonfatal user error> 
> org.apache.openjpa.persistence.ArgumentException: "Encountered "count ( *" at 
> character 8, but expected: ["(", "+", "-", ":", "?", "ABS", "AVG", "CASE", 
> "COALESCE", "CONCAT", "COUNT", "CURRENT_DATE", "CURRENT_TIME", 
> "CURRENT_TIMESTAMP", "DISTINCT", "ENTRY", "INDEX", "KEY", "LENGTH", "LOCATE", 
> "LOWER", "MAX", "MIN", "MOD", "NEW", "NULLIF", "OBJECT", "SIZE", "SQRT", 
> "SUBSTRING", "SUM", "TRIM", "TYPE", "UPPER", "VALUE", <BOOLEAN_LITERAL>, 
> <DATE_LITERAL>, <DECIMAL_LITERAL>, <IDENTIFIER>, <INTEGER_LITERAL>, 
> <STRING_LITERAL>, <TIMESTAMP_LITERAL>, <TIME_LITERAL>]." while parsing JPQL 
> "select count(*)  from PersonDb p where p.objectId in (select 
> f.friend.objectId from PersonDb p, FriendDb f where p.objectId = 
> f.person.objectId and p.id in (?1))". See nested stack trace for original 
> parse error.
>       at org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:51)
>       at 
> org.apache.openjpa.kernel.ExpressionStoreQuery.newCompilation(ExpressionStoreQuery.java:150)
>       at 
> org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:670)
>       at 
> org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:652)
>       at 
> org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:618)
>       at 
> org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:680)
>       at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:587)
>       at 
> org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:985)
>       at 
> org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:971)
>       at 
> org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:100)
>       at 
> org.apache.shindig.social.opensocial.jpa.spi.JPQLUtils.createQuery(JPQLUtils.java:112)
>       at 
> org.apache.shindig.social.opensocial.jpa.spi.JPQLUtils.getTotalResults(JPQLUtils.java:98)
>       at 
> org.apache.shindig.social.opensocial.jpa.spi.PersonServiceDb.getPeople(PersonServiceDb.java:135)
>       at 
> org.apache.shindig.social.opensocial.service.PersonHandler.get(PersonHandler.java:86)
>       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.apache.shindig.protocol.DefaultHandlerRegistry$MethodCaller.call(DefaultHandlerRegistry.java:483)
>       at 
> org.apache.shindig.protocol.DefaultHandlerRegistry$RpcInvocationHandler.execute(DefaultHandlerRegistry.java:301)
>       at 
> org.apache.shindig.protocol.DefaultHandlerRegistry$RpcInvocationWrapper.execute(DefaultHandlerRegistry.java:325)
>       at 
> org.apache.shindig.protocol.JsonRpcServlet.dispatchBatch(JsonRpcServlet.java:185)
>       at 
> org.apache.shindig.protocol.JsonRpcServlet.service(JsonRpcServlet.java:130)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>       at 
> org.apache.shindig.auth.AuthenticationServletFilter.callChain(AuthenticationServletFilter.java:125)
>       at 
> org.apache.shindig.auth.AuthenticationServletFilter.doFilter(AuthenticationServletFilter.java:88)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>       at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
>       at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
>       at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
>       at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>       at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>       at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
>       at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
>       at 
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
>       at 
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
>       at java.lang.Thread.run(Thread.java:619)
> Caused by: <openjpa-2.0.0-r422266:935683 nonfatal user error> 
> org.apache.openjpa.persistence.ArgumentException: Encountered "count ( *" at 
> character 8, but expected: ["(", "+", "-", ":", "?", "ABS", "AVG", "CASE", 
> "COALESCE", "CONCAT", "COUNT", "CURRENT_DATE", "CURRENT_TIME", 
> "CURRENT_TIMESTAMP", "DISTINCT", "ENTRY", "INDEX", "KEY", "LENGTH", "LOCATE", 
> "LOWER", "MAX", "MIN", "MOD", "NEW", "NULLIF", "OBJECT", "SIZE", "SQRT", 
> "SUBSTRING", "SUM", "TRIM", "TYPE", "UPPER", "VALUE", <BOOLEAN_LITERAL>, 
> <DATE_LITERAL>, <DECIMAL_LITERAL>, <IDENTIFIER>, <INTEGER_LITERAL>, 
> <STRING_LITERAL>, <TIMESTAMP_LITERAL>, <TIME_LITERAL>].
>       at 
> org.apache.openjpa.kernel.jpql.JPQL.generateParseException(JPQL.java:13087)
>       at org.apache.openjpa.kernel.jpql.JPQL.jj_consume_token(JPQL.java:12961)
>       at org.apache.openjpa.kernel.jpql.JPQL.select_expression(JPQL.java:1001)
>       at org.apache.openjpa.kernel.jpql.JPQL.select_expressions(JPQL.java:930)
>       at org.apache.openjpa.kernel.jpql.JPQL.select_clause(JPQL.java:865)
>       at org.apache.openjpa.kernel.jpql.JPQL.select_statement(JPQL.java:87)
>       at org.apache.openjpa.kernel.jpql.JPQL.parseQuery(JPQL.java:63)
>       at 
> org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.parse(JPQLExpressionBuilder.java:2371)
>       at 
> org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.<init>(JPQLExpressionBuilder.java:2358)
>       at org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:49)
>       ... 39 more
>   
> Can you please tell me if openjpa support count(*) or not, or if not then 
> will fix the method in JPQLUtil.java?
> Thank you.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to