powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / eclipselink UNION ALL выдает nullpointer
7 сообщений из 7, страница 1 из 1
eclipselink UNION ALL выдает nullpointer
    #38561592
Viktor Grafskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, мучаю 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
eclipselink UNION ALL выдает nullpointer
    #38561655
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor Grafskiy,

Очень слабо ваш запрос похож на JPQL. JPQL с какой версии поддерживает UNION и LEFT OUTER JOIN?
...
Рейтинг: 0 / 0
eclipselink UNION ALL выдает nullpointer
    #38561664
Viktor Grafskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
eclipselink UNION ALL выдает nullpointer
    #38561671
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ого, как далеко жпа шагнул. Попробуйте разные алиасы использовать в подзапросах.
...
Рейтинг: 0 / 0
eclipselink UNION ALL выдает nullpointer
    #38561868
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может быть я чего-то не понимаю, но почему нельзя выбросить union all:
Код: sql
1.
on  (d.valueDate > :userdate) AND ( (b = d.buyer) OR (b = d.seller) )

?
...
Рейтинг: 0 / 0
eclipselink UNION ALL выдает nullpointer
    #38561886
Viktor Grafskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
eclipselink UNION ALL выдает nullpointer
    #38562470
Viktor Grafskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczОго, как далеко жпа шагнул. Попробуйте разные алиасы использовать в подзапросах.Пробовал не помогает.

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


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