Thanks Tom. The following is the exact query and stack trace. If I left join
to i.reservations instead of i.subItems it works fine. i.e. maybe it has
something to do with the fact that it's joining to itself?
Feb 19, 2007 3:53:04 PM edu.uchicago.at.reservations.ReservationsService
findAvailableItems
FINEST: SELECT i FROM Item i LEFT JOIN FETCH i.subItems ORDER BY i.name
Feb 19, 2007 3:53:04 PM
oracle.toplink.essentials.session.file:/J:/Reservations/ReservationsLibrary/build/classes/-Reservations
WARNING:
java.lang.NullPointerException
at
oracle.toplink.essentials.internal.expressions.SQLSelectStatement.appendFromClauseForOuterJoin(SQLSelectStatement.java:347)
at
oracle.toplink.essentials.internal.expressions.SQLSelectStatement.appendFromClauseToWriter(SQLSelectStatement.java:452)
at
oracle.toplink.essentials.internal.expressions.SQLSelectStatement.printSQL(SQLSelectStatement.java:1310)
at
oracle.toplink.essentials.internal.expressions.SQLSelectStatement.buildCall(SQLSelectStatement.java:683)
at
oracle.toplink.essentials.descriptors.ClassDescriptor.buildCallFromStatement(ClassDescriptor.java:548)
at
oracle.toplink.essentials.internal.queryframework.StatementQueryMechanism.setCallFromStatement(StatementQueryMechanism.java:393)
at
oracle.toplink.essentials.internal.queryframework.ExpressionQueryMechanism.prepareReportQuerySelectAllRows(ExpressionQueryMechanism.java:1379)
at
oracle.toplink.essentials.queryframework.ReportQuery.prepareSelectAllRows(ReportQuery.java:988)
at
oracle.toplink.essentials.queryframework.ReadAllQuery.prepare(ReadAllQuery.java:398)
at
oracle.toplink.essentials.queryframework.ReportQuery.prepare(ReportQuery.java:904)
at
oracle.toplink.essentials.queryframework.DatabaseQuery.checkPrepare(DatabaseQuery.java:387)
at
oracle.toplink.essentials.queryframework.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:469)
at
oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:587)
at
oracle.toplink.essentials.queryframework.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:677)
at
oracle.toplink.essentials.queryframework.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:731)
at
oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2219)
at
oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:937)
at
oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:909)
at
oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:335)
at
oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.getResultList(EJBQueryImpl.java:442)
at
edu.uchicago.at.reservations.ReservationsService.findAvailableItems(ReservationsService.java:61)
at
edu.uchicago.at.reservations.ReservationsServiceTest.testFindAvailableItems(ReservationsServiceTest.java:91)
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:585)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
Jon
----- Original Message -----
From: "Tom Ware" <tom.ware_at_Oracle.com>
To: <persistence_at_glassfish.dev.java.net>
Sent: Monday, February 19, 2007 3:27 PM
Subject: Re: Is it legal to have a JPQL query that has multiple LEFT JOIN
FETCHes?
> Hi Jon,
>
> I am a bit surprised you are seeing an issue with the query you list
> below.
>
> Our test framework has some similar queries that work. For instance:
>
> "SELECT e from Employee e JOIN FETCH e.projects"
>
> Is the exception trace for your current query the same as for the
> previous query?
>
> BTW: I took a quick look at the BNF for JPQL and it seems your double
> joining query is not legal. JPQL requires a range_variable_declaration
> for each fetch join. That means:
> Item i LEFT JOIN FETCH i.reservations
>
> Is Legal
>
> And the second part:
>
> LEFT JOIN FETCH i.subItems
> Is missing something. (you can't join to "Item i" from the previous
> clause)
>
> -Tom
>
>
> Jon Miller wrote:
>
>>I just tried the following which throws a NPE too. So, it looks like it's
>>probably the fact that I'm mapping to the same class rather than the fact
>>that I had two LEFT JOINs which is what I thought might have been the
>>original problem. Is this a bug?
>>
>>SELECT i FROM Item i LEFT JOIN FETCH i.subItems ORDER BY i.name
>>
>>Jon
>>
>
> --
> Tom Ware
> Principal Software Engineer
> Oracle Canada Inc.
>
> Direct: (613) 783-4598
> Email: tom.ware_at_oracle.com
>