2013-09-20 2 views
1

Я пытаюсь выполнить запрос JPQL на следующем графике Entity: Derived1 и Derived2 являются подклассами ReferencedEntity. Основной объект имеет список ссылочной информации. Предположим, что в списке каждого MainEntity есть только один экземпляр Derived1 и Derived2.JPA2.1 JPQL Query с несколькими действиями TREAT (...) в JOIN

+--------------+ 
| MainEntity | 
+--------------+     +------------------+ 
| list  | --- OneToMany ---> | ReferencedEntity | 
+--------------+     +------------------+ 
            | String a1  | 
            +------------------+ 
              ^
               | 
            +-----------+-----------+ 
            |      | 
          +--------------+   +--------------+ 
          | Derived1 |   | Derived2 | 
          +--------------+   +--------------+ 
          | String d1 |   | String d2 | 
          +--------------+   +--------------+ 

Теперь я хочу группировать MainEntities по значениям d1 и d2, которые они содержат в своем списке. Поэтому я пишу следующее JPQL запроса:

SELECT COUNT(m) FROM MainEntity m JOIN TREAT(m.list AS Derived1) der1, TREAT(m.list AS Derived2) der2 GROUP BY der1.d1, der2.d2 

Я думаю, что это должно работать, но я получаю:

Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing [SELECT COUNT(m) from MainEntity m JOIN TREAT(m.list AS Derived1) der1, TREAT(m.list AS Derived2) der2 GROUP BY der1.d1, der2.d2]. 
[83, 84] The FROM clause has 'TREAT(m.list' and 'AS Derived2' that are not separated by a comma. 
[83, 83] The right parenthesis is missing from the sub-expression. 
[77, 83] The identification variable 'm.list' is not following the rules for a Java identifier. 
[84, 84] A "root object" must be specified. 
[95, 127] The query contains a malformed ending. 
     at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155) 
     at org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:334) 
     at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278) 
     at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163) 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142) 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116) 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:102) 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:86) 
     at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1583) 
     ... 2 more 
Java Result: 1 

Только для целей тестирования я попробовал другой присоединиться:

SELECT COUNT(m) FROM MainEntity m JOIN TREAT(m.list AS Derived1) der1, m.list refd GROUP BY der1.d1, refd.a1 

Это один работает и доставляет результат.

Тогда я попробовал третий запрос и просто изменил порядок объединения:

SELECT COUNT(m) FROM MainEntity m JOIN m.list refd, TREAT(m.list AS Derived1) der1 GROUP BY der1.d1, refd.a1 

Это приводит к точно такой же Exception (но на этот раз для Derived1).

Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing [SELECT COUNT(m) from MainEntity m JOIN m.list refd, TREAT(m.list AS Derived1) der1 GROUP BY der1.d1, refd.a1]. 
[64, 65] The FROM clause has 'TREAT(m.list' and 'AS Derived1' that are not separated by a comma. 
[64, 64] The right parenthesis is missing from the sub-expression. 
[58, 64] The identification variable 'm.list' is not following the rules for a Java identifier. 
[65, 65] A "root object" must be specified. 
[76, 108] The query contains a malformed ending. 
     at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155) 
     at org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:334) 
     at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278) 
     at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163) 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142) 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116) 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:102) 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:86) 
     at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1583) 
     ... 2 more 
Java Result: 1 

Для меня это выглядит как там может быть ошибка в EclipseLink, или я попробовать что-то Thats запрещено?

+0

Вы пробовали '... JOIN TREAT (m.list AS Derived1) der1 JOIN TREAT (m.list AS Derived2) der2 ...'? – DannyMo

+0

Работал, THX! (Теперь я чувствую себя глупо;)) Не могли бы вы официально ответить на это? – Sheba

ответ

3

Согласно спецификации, правильный синтаксис должен быть:

... JOIN TREAT(m.list AS Derived1) der1 JOIN TREAT(m.list AS Derived2) der2 ...

без каких-либо запятых.

Смежные вопросы