Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / eclipselink UNION ALL выдает nullpointer / 7 сообщений из 7, страница 1 из 1
14.02.2014, 22:26
    #38561592
Viktor Grafskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
eclipselink UNION ALL выдает nullpointer
Здравствуйте, мучаю eclipselink, который с версии 2.4 должен поддерживать объединения. Есть следующий код, при выполнении получаю исключение:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    @Test
    public void testQuery() {
        EntityManager em = Persistence.createEntityManagerFactory("FODMModelPU").createEntityManager();
        Query q = em.createQuery(getQueryString0()); //  <----- Вот в этом месте получаю NullPointerException
        .....
    }

    private String getQueryString0() {
        return ""
                + "SELECT b, (d.priceBuyer * d.amount) AS amount "
                + "FROM Bank b LEFT OUTER JOIN Deal d "
                + "ON (d.valueDate > :userdate) "
                + "AND "
                + "(b = d.buyer) "
                + "GROUP BY b "
                + ""
                + "UNION ALL "
                + ""
                + "SELECT b, (d.priceSeller * d.amount) AS amount "
                + "FROM Bank b LEFT OUTER JOIN Deal d "
                + "ON (d.valueDate > :userdate) "
                + "AND "
                + "(b = d.seller) "
                + "GROUP BY b"
                ;
    }


Исключение
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
 Exception Description: Query failed to prepare, unexpected error occurred: [java.lang.NullPointerException]. Internal Exception: java.lang.NullPointerException Query: ReportQuery(referenceClass=Bank jpql="SELECT b, (d.priceBuyer * d.amount) AS amount FROM Bank b LEFT OUTER JOIN Deal d ON (d.valueDate > :userdate) AND (b = d.buyer) GROUP BY b UNION ALL SELECT b, (d.priceSeller * d.amount) AS amount FROM Bank b LEFT OUTER JOIN Deal d ON (d.valueDate > :userdate) AND (b = d.seller) GROUP BY b")
Local Exception Stack
Exception [EclipseLink-6168] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.QueryException
Exception Description: Query failed to prepare, unexpected error occurred: [java.lang.NullPointerException].
Internal Exception: java.lang.NullPointerException
Query: ReportQuery(referenceClass=Bank jpql="SELECT b, (d.priceBuyer * d.amount) AS amount FROM Bank b LEFT OUTER JOIN Deal d ON (d.valueDate > :userdate) AND (b = d.buyer) GROUP BY b UNION ALL SELECT b, (d.priceSeller * d.amount) AS amount FROM Bank b LEFT OUTER JOIN Deal d ON (d.valueDate > :userdate) AND (b = d.seller) GROUP BY b")
	at org.eclipse.persistence.exceptions.QueryException.prepareFailed(QueryException.java:1589)
	at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:680)
	at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:901)
	at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:613)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:194)
	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:1603)
	at ru.leonenkov.fodm.model.DealJpaControllerTest.testQuery(DealJpaControllerTest.java:61)
	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:606)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
	at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
	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:606)
	at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
	at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
	at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)
Caused by: java.lang.NullPointerException
	at org.eclipse.persistence.internal.expressions.SQLSelectStatement.appendFromClauseForOuterJoin(SQLSelectStatement.java:286)
	at org.eclipse.persistence.internal.expressions.SQLSelectStatement.appendFromClauseToWriter(SQLSelectStatement.java:521)
	at org.eclipse.persistence.internal.expressions.SQLSelectStatement.printSQL(SQLSelectStatement.java:1679)
	at org.eclipse.persistence.internal.expressions.SubSelectExpression.printSQL(SubSelectExpression.java:267)
	at org.eclipse.persistence.expressions.ExpressionOperator.printCollection(ExpressionOperator.java:2194)
	at org.eclipse.persistence.internal.expressions.FunctionExpression.printSQL(FunctionExpression.java:545)
	at org.eclipse.persistence.internal.expressions.SQLSelectStatement.appendUnionClauseToWriter(SQLSelectStatement.java:732)
	at org.eclipse.persistence.internal.expressions.SQLSelectStatement.printSQL(SQLSelectStatement.java:1711)
	at org.eclipse.persistence.internal.databaseaccess.DatabasePlatform.printSQLSelectStatement(DatabasePlatform.java:3178)
	at org.eclipse.persistence.platform.database.MySQLPlatform.printSQLSelectStatement(MySQLPlatform.java:673)
	at org.eclipse.persistence.internal.expressions.SQLSelectStatement.buildCall(SQLSelectStatement.java:782)
	at org.eclipse.persistence.internal.expressions.SQLSelectStatement.buildCall(SQLSelectStatement.java:792)
	at org.eclipse.persistence.descriptors.ClassDescriptor.buildCallFromStatement(ClassDescriptor.java:813)
	at org.eclipse.persistence.internal.queries.StatementQueryMechanism.setCallFromStatement(StatementQueryMechanism.java:390)
	at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareReportQuerySelectAllRows(ExpressionQueryMechanism.java:1696)
	at org.eclipse.persistence.queries.ReportQuery.prepareSelectAllRows(ReportQuery.java:1203)
	at org.eclipse.persistence.queries.ReadAllQuery.prepare(ReadAllQuery.java:744)
	at org.eclipse.persistence.queries.ReportQuery.prepare(ReportQuery.java:1071)
	at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:661)
	... 38 more


При этом, если закомментировать часть запроса, то все отрабатывает на ура:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    private String getQueryString0() {
        return ""
                + "SELECT b, (d.priceBuyer * d.amount) AS amount "
                + "FROM Bank b LEFT OUTER JOIN Deal d "
                + "ON (d.valueDate > :userdate) "
                + "AND "
                + "(b = d.buyer) "
                + "GROUP BY b "
//                + ""
//                + "UNION ALL "
//                + ""
//                + "SELECT b, (d.priceSeller * d.amount) AS amount "
//                + "FROM Bank b LEFT OUTER JOIN Deal d "
//                + "ON (d.valueDate > :userdate) "
//                + "AND "
//                + "(b = d.seller) "
//                + "GROUP BY b"
                ;
    }


Быть может кто сталкивался с проблемой и знает как решить?
...
Рейтинг: 0 / 0
15.02.2014, 00:52
    #38561655
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
eclipselink UNION ALL выдает nullpointer
Viktor Grafskiy,

Очень слабо ваш запрос похож на JPQL. JPQL с какой версии поддерживает UNION и LEFT OUTER JOIN?
...
Рейтинг: 0 / 0
15.02.2014, 01:23
    #38561664
Viktor Grafskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
eclipselink UNION ALL выдает nullpointer
Blazkowicz Очень слабо ваш запрос похож на JPQL. JPQL с какой версии поддерживает UNION и LEFT OUTER JOIN?Поддерживает с версии 2.4, на их сайте написано. Я использую 2.5.1
pom.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>eclipselink</artifactId>
      <version>2.5.1</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
      <version>2.5.1</version>
      <scope>provided</scope>
    </dependency>



Я ещё больше упростил запрос и нашел, что при добавлении во вторую выборку условия ON, как раз nullpointer и появляется:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    private String getQueryString6() {
        return ""
                + "SELECT b, d FROM Bank b LEFT OUTER JOIN Deal d "
                + "ON (b = d.buyer) "
                + "GROUP BY b "
                + ""
                + "UNION ALL "
                + ""
                + "SELECT b, d FROM Bank b LEFT OUTER JOIN Deal d "
//                + "ON (b = d.seller) "  <-- вот эта штуковина вызывает NullPointerException, если расскоментировать строку, то тест не проходит
                + "GROUP BY b "
                ;
    }

Я думаю тут какой нибудь хитрый синтаксис должен использоваться(хотя тогда исключение должен выбрасывать parser) либо это баг. Завтра попробую другую версию eclipselink'а, быть может спасет, но эта собака мне нервы сегодня подпортила...
...
Рейтинг: 0 / 0
15.02.2014, 01:42
    #38561671
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
eclipselink UNION ALL выдает nullpointer
Ого, как далеко жпа шагнул. Попробуйте разные алиасы использовать в подзапросах.
...
Рейтинг: 0 / 0
15.02.2014, 16:24
    #38561868
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
eclipselink UNION ALL выдает nullpointer
может быть я чего-то не понимаю, но почему нельзя выбросить union all:
Код: sql
1.
on  (d.valueDate > :userdate) AND ( (b = d.buyer) OR (b = d.seller) )

?
...
Рейтинг: 0 / 0
15.02.2014, 17:11
    #38561886
Viktor Grafskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
eclipselink UNION ALL выдает nullpointer
Basil A. Sidorov,

К сожалению не выйдет, вот полный запрос, который хотелось бы перетащить в JPA
SQL
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT NAME, SUM(AMOUNT) FROM (
SELECT B.NAME, (D.PRICESELLER * D.AMOUNT) AS AMOUNT
    FROM BANK B LEFT OUTER JOIN DEAL D
    ON
    (D.VALUEDATE > CURRENT_DATE)
    AND
    (D.SELLER_ID = B.ID)
   GROUP BY B.NAME
UNION ALL
SELECT B.NAME, (D.PRICEBUYER * D.AMOUNT) AS AMOUNT
    FROM BANK B LEFT OUTER JOIN DEAL D
    ON
    (D.VALUEDATE > CURRENT_DATE)
    AND
    (D.BUYER_ID = B.ID)
    GROUP BY B.NAME
) T
GROUP BY T.NAME;

...
Рейтинг: 0 / 0
16.02.2014, 21:09
    #38562470
Viktor Grafskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
eclipselink UNION ALL выдает nullpointer
BlazkowiczОго, как далеко жпа шагнул. Попробуйте разные алиасы использовать в подзапросах.Пробовал не помогает.

Смена версий eclipseLink и sql-connector результата не принесла. В итоге я плюнул и перешел на nativeQuery. Сдается мне, сыровата поддержка UNION ALL в eclipselink'е, хотя может просто руки кривые. Я попробую отправить им сообщение в баг-трекер посмотрю чего напишут. Спасибо всем!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / eclipselink UNION ALL выдает nullpointer / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]