Hi,
I have a lazy loading 1:n association. I'd like to write a query to eager
fetch that association on demand.
@Entity
@NamedQueries(@NamedQuery(name = "fetchB", query = "SELECT a from A a LEFT
JOIN FETCH a.b WHERE a.id = :id"))
public class A {
@Id
private long id;
private String name;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "FIRMA_ID")
private Collection b;
...
@Entity
public class B {
@Id
private long id;
private String name;
...
When I execute the named query ...
A a = em.createNamedQuery("fetchB", A.class).setParameter("id",
42).getSingleResult();
... the following SQL statement is executed against the database:
SELECT t0.id, t0.name, t1.FIRMA_ID, t1.id, t1.name
FROM S.A t0 LEFT OUTER JOIN S.B t1 ON t0.id = t1.FIRMA_ID
WHERE (t0.id = ?) optimize for 1 row
If I execute it with my favourite SQL tool, I get a result set of size 2.
OpenJPA throws a NullpointerException:
org.apache.openjpa.persistence.PersistenceException: null
FailedObject: SELECT a from A a LEFT JOIN FETCH a.b WHERE a.id = :id
[java.lang.String]
at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:986)
at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:885)
at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1030)
at
org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:280)
at
org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.load(SelectImpl.java:2344)
at
org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:274)
at
org.apache.openjpa.jdbc.kernel.InstanceResultObjectProvider.getResultObject(InstanceResultObjectProvider.java:59)
at org.apache.openjpa.lib.rop.EagerResultList.(EagerResultList.java:36)
at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1246)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1005)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:861)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:792)
at
org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:288)
at
org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
at
org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:326)
at
JpaFetchTestManual.testFindQuery(JpaFetchTestManual.java:58)
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:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at
org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.NullPointerException
at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.setInverseRelation(JDBCStoreManager.java:469)
at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(JDBCStoreManager.java:429)
at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initialize(JDBCStoreManager.java:322)
at
org.apache.openjpa.kernel.DelegatingStoreManager.initialize(DelegatingStoreManager.java:112)
at
org.apache.openjpa.kernel.ROPStoreManager.initialize(ROPStoreManager.java:57)
at org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:1005)
at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:963)
... 35 more
What can be wrong with this simple example? Did I miss something?
Cheers,
Tobias
--
View this message in context:
http://openjpa.208410.n2.nabble.com/NPE-with-Fetch-Join-Query-tp6222526p6222526.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.