From 2dca1bdf5b2429e72f1edaaf606aad304ffb5cf4 Mon Sep 17 00:00:00 2001 From: rbygrave Date: Fri, 18 Jul 2014 23:35:14 +1200 Subject: [PATCH] Fix for #172 - Regression: @Where predicates not applied in eager fetch (but are on lazy load) --- .../server/core/DefaultBeanLoader.java | 10 ++++ .../tests/batchload/TestSecondaryQueries.java | 2 +- .../query/TestQueryFetchManyTwoDeep.java | 2 +- .../query/other/TestWhereAnnotation.java | 56 +++++++++++++++++++ 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/avaje/tests/query/other/TestWhereAnnotation.java diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultBeanLoader.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultBeanLoader.java index 4c9d234c3..863b03896 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultBeanLoader.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultBeanLoader.java @@ -24,6 +24,7 @@ import com.avaje.ebeaninternal.api.SpiQuery.Mode; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocMany; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor.EntityType; +import com.avaje.ebeaninternal.server.lib.util.StringHelper; import com.avaje.ebeaninternal.server.transaction.DefaultPersistenceContext; /** @@ -112,6 +113,15 @@ public class DefaultBeanLoader { if (orderBy != null) { query.orderBy(orderBy); } + + String extraWhere = many.getExtraWhere(); + if (extraWhere != null) { + // replace special ${ta} placeholder with the base table alias + // which is always t0 and add the extra where clause + String ew = StringHelper.replaceString(extraWhere, "${ta}", "t0"); + query.where().raw(ew); + } + query.setLazyLoadForParents(idList, many); many.addWhereParentIdIn(query, idList); diff --git a/src/test/java/com/avaje/tests/batchload/TestSecondaryQueries.java b/src/test/java/com/avaje/tests/batchload/TestSecondaryQueries.java index 76f39f9bb..9e3e7ef7e 100644 --- a/src/test/java/com/avaje/tests/batchload/TestSecondaryQueries.java +++ b/src/test/java/com/avaje/tests/batchload/TestSecondaryQueries.java @@ -103,7 +103,7 @@ public class TestSecondaryQueries extends BaseTestCase { // from o_order_detail t0 // where (t0.order_id) in (?,?,?,?,?) ; --bind(1,4,1,1,1) - Assert.assertTrue(ordSecondarySql.contains(" from o_order_detail t0 where (t0.order_id) in (?")); + Assert.assertTrue(ordSecondarySql.contains(" from o_order_detail t0 where t0.id > 0 and (t0.order_id) in (?")); } } diff --git a/src/test/java/com/avaje/tests/query/TestQueryFetchManyTwoDeep.java b/src/test/java/com/avaje/tests/query/TestQueryFetchManyTwoDeep.java index a3aad61be..1c64e7824 100644 --- a/src/test/java/com/avaje/tests/query/TestQueryFetchManyTwoDeep.java +++ b/src/test/java/com/avaje/tests/query/TestQueryFetchManyTwoDeep.java @@ -51,7 +51,7 @@ public class TestQueryFetchManyTwoDeep extends BaseTestCase { SpiQuery secondaryQuery = secondaryQueries.get(0); String secondarySql = secondaryQuery.getGeneratedSql(); - Assert.assertTrue(secondarySql.contains("from o_order_detail t0 where (t0.order_id) in")); + Assert.assertTrue(secondarySql.contains("from o_order_detail t0 where t0.id > 0 and (t0.order_id) in")); // select t0.order_id c0, t0.id c1, t0.order_qty c2, t0.ship_qty c3, t0.unit_price c4, t0.cretime c5, t0.updtime c6, t0.order_id c7, t0.product_id c8 // from o_order_detail t0 diff --git a/src/test/java/com/avaje/tests/query/other/TestWhereAnnotation.java b/src/test/java/com/avaje/tests/query/other/TestWhereAnnotation.java new file mode 100644 index 000000000..7d5410321 --- /dev/null +++ b/src/test/java/com/avaje/tests/query/other/TestWhereAnnotation.java @@ -0,0 +1,56 @@ +package com.avaje.tests.query.other; + +import java.util.List; + +import org.avaje.ebeantest.LoggedSqlCollector; +import org.junit.Assert; +import org.junit.Test; + +import com.avaje.ebean.BaseTestCase; +import com.avaje.ebean.Ebean; +import com.avaje.tests.model.basic.Customer; +import com.avaje.tests.model.basic.Order; +import com.avaje.tests.model.basic.ResetBasicData; + +public class TestWhereAnnotation extends BaseTestCase { + + @Test + public void fetchEager_inFirstQuery(){ + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + Ebean.find(Customer.class) + .fetch("orders") + .findList(); + + List loggedSql = LoggedSqlCollector.stop(); + + Assert.assertEquals(1, loggedSql.size()); + + String sql = loggedSql.get(0); + Assert.assertTrue(sql.contains("t1.order_date is not null")); + } + + @Test + public void fetchLazy_inLazyLoadQuery(){ + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + List customers = Ebean.find(Customer.class).findList(); + + List orders = customers.get(0).getOrders(); + orders.size(); + + List loggedSql = LoggedSqlCollector.stop(); + + Assert.assertEquals(2, loggedSql.size()); + + String sql = loggedSql.get(1); + Assert.assertTrue(sql.contains("t0.order_date is not null")); + } + +}