diff --git a/src/main/java/com/avaje/ebean/bean/BeanCollection.java b/src/main/java/com/avaje/ebean/bean/BeanCollection.java index 17cbf6ab3..59470843e 100644 --- a/src/main/java/com/avaje/ebean/bean/BeanCollection.java +++ b/src/main/java/com/avaje/ebean/bean/BeanCollection.java @@ -31,6 +31,11 @@ public interface BeanCollection extends Serializable { ALL } + /** + * Set the disableLazyLoad state. + */ + void setDisableLazyLoad(boolean disableLazyLoad); + /** * Load bean from another collection. */ diff --git a/src/main/java/com/avaje/ebean/common/AbstractBeanCollection.java b/src/main/java/com/avaje/ebean/common/AbstractBeanCollection.java index 7e1e21171..d7270fcbf 100644 --- a/src/main/java/com/avaje/ebean/common/AbstractBeanCollection.java +++ b/src/main/java/com/avaje/ebean/common/AbstractBeanCollection.java @@ -20,6 +20,8 @@ public abstract class AbstractBeanCollection implements BeanCollection { protected boolean readOnly; + protected boolean disableLazyLoad; + /** * The EbeanServer this is associated with. (used for lazy fetch). */ @@ -84,6 +86,11 @@ public abstract class AbstractBeanCollection implements BeanCollection { this.filterMany = filterMany; } + @Override + public void setDisableLazyLoad(boolean disableLazyLoad) { + this.disableLazyLoad = disableLazyLoad; + } + protected void lazyLoadCollection(boolean onlyIds) { if (loader == null) { loader = (BeanCollectionLoader) Ebean.getServer(ebeanServerName); diff --git a/src/main/java/com/avaje/ebean/common/BeanList.java b/src/main/java/com/avaje/ebean/common/BeanList.java index fbfb9bfd5..2b01cd367 100644 --- a/src/main/java/com/avaje/ebean/common/BeanList.java +++ b/src/main/java/com/avaje/ebean/common/BeanList.java @@ -102,7 +102,7 @@ public final class BeanList extends AbstractBeanCollection implements List private void initClear() { synchronized (this) { if (list == null) { - if (modifyListening) { + if (!disableLazyLoad && modifyListening) { lazyLoadCollection(true); } else { list = new ArrayList(); @@ -114,7 +114,11 @@ public final class BeanList extends AbstractBeanCollection implements List private void init() { synchronized (this) { if (list == null) { - lazyLoadCollection(false); + if (disableLazyLoad) { + list = new ArrayList(); + } else { + lazyLoadCollection(false); + } } } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeBean.java b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeBean.java index 9cefd1689..b41467ca5 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeBean.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeBean.java @@ -303,7 +303,7 @@ public class SqlTreeNodeBean implements SqlTreeNode { if (!lazyLoadMany && localBean != null) { ctx.setCurrentPrefix(prefix, pathMap); if (readId && !temporalVersions) { - createListProxies(localDesc, ctx, localBean); + createListProxies(localDesc, ctx, localBean, disableLazyLoad); } if (temporalMode == SpiQuery.TemporalMode.DRAFT) { localDesc.setDraft(localBean); @@ -360,7 +360,7 @@ public class SqlTreeNodeBean implements SqlTreeNode { * Create lazy loading proxies for the Many's except for the one that is * included in the actual query. */ - private void createListProxies(BeanDescriptor localDesc, DbReadContext ctx, EntityBean localBean) { + private void createListProxies(BeanDescriptor localDesc, DbReadContext ctx, EntityBean localBean, boolean disableLazyLoad) { BeanPropertyAssocMany fetchedMany = ctx.getManyProperty(); @@ -371,8 +371,12 @@ public class SqlTreeNodeBean implements SqlTreeNode { if (fetchedMany == null || !fetchedMany.equals(manys[i])) { // create a proxy for the many (deferred fetching) BeanCollection ref = manys[i].createReferenceIfNull(localBean); - if (ref != null && !ref.isRegisteredWithLoadContext()) { - ctx.register(manys[i].getName(), ref); + if (ref != null) { + if (disableLazyLoad) { + ref.setDisableLazyLoad(true); + } else if (!ref.isRegisteredWithLoadContext()) { + ctx.register(manys[i].getName(), ref); + } } } } diff --git a/src/test/java/com/avaje/tests/batchload/TestQueryDisableLazyLoad.java b/src/test/java/com/avaje/tests/batchload/TestQueryDisableLazyLoad.java new file mode 100644 index 000000000..54b18bf49 --- /dev/null +++ b/src/test/java/com/avaje/tests/batchload/TestQueryDisableLazyLoad.java @@ -0,0 +1,42 @@ +package com.avaje.tests.batchload; + +import com.avaje.ebean.Ebean; +import com.avaje.tests.model.basic.Order; +import com.avaje.tests.model.basic.OrderDetail; +import com.avaje.tests.model.basic.ResetBasicData; +import org.avaje.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; + +public class TestQueryDisableLazyLoad { + + @Test + public void onAssocMany() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + List l0 = Ebean.find(Order.class) + .setDisableLazyLoading(true) + .order().asc("id") + .findList(); + + assertThat(l0).isNotEmpty(); + + Order order = l0.get(0); + + List details = order.getDetails(); + assertEquals(details.size(), 0); + + List loggedSql = LoggedSqlCollector.stop(); + assertThat(loggedSql).hasSize(1); + + assertThat(loggedSql.get(0)).contains("select t0.id c0, t0.status c1, t0.order_date c2,"); + assertThat(loggedSql.get(0)).contains(" from o_order t0 "); + } +} diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml index 466673fd5..c6a513108 100644 --- a/src/test/resources/logback-test.xml +++ b/src/test/resources/logback-test.xml @@ -76,10 +76,10 @@ - - - - + + + +