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.

Reply via email to