java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at com.avaje.ebeaninternal.server.core.DefaultBeanLoader.loadMany(DefaultBeanLoader.java:124) at com.avaje.ebeaninternal.server.core.DefaultServer.loadMany(DefaultServer.java:439) at com.avaje.ebeaninternal.server.loadcontext.DLoadManyContext.loadMany(DLoadManyContext.java:143) at com.avaje.ebean.common.AbstractBeanCollection.lazyLoadCollection(AbstractBeanCollection.java:152) at com.avaje.ebean.common.BeanList.init(BeanList.java:116) at com.avaje.ebean.common.BeanList.size(BeanList.java:402) at unittest.TestOne.testFilterOutOfBoundsException(TestOne.java:664) 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:597) 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:81) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
The issue revolves around loading of *ToMany relationships via +query or +lazy.
Specifically, if there are no rows for a given beanCollection (due to say predicates on a filterMany) then the state of the BeanCollection is not correctly updated (to reflect that the BeanCollection is loaded but empty).
The fix is to check the +query and +lazy loaded BeanCollections to make sure that if they where not loaded that their state is now "loaded but empty".
Added in some checking on DefaultBeanLoader to check each loaded BeanCollection for the case that it's state was not set due to no matching rows.
// check for BeanCollection's that where never processed // in the +query or +lazy load due to no rows (predicates) for (int i = 0; i < batch.size(); i++) { if (batch.get(i).checkEmptyLazyLoad()) { if (logger.isLoggable(Level.FINE)){ logger.fine("BeanCollection after load was empty owner:"+batch.get(i).getOwnerBean()); } } }
Fixed in HEAD.