diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java index 6c5a2ead1a..f0b90c6aed 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java @@ -25,7 +25,7 @@ final class SqlTreeNodeExtraJoin implements SqlTreeNode { private final STreePropertyAssoc assocBeanProperty; private final SpiQuery.TemporalMode temporalMode; private final String prefix; - private final boolean manyJoin; + private boolean manyJoin; private final boolean pathContainsMany; private List children; @@ -95,6 +95,9 @@ public void addChild(SqlTreeNode child) { if (children == null) { children = new ArrayList<>(); } + if (child.hasMany()) { + manyJoin = true; + } children.add(child); } diff --git a/ebean-test/src/test/java/org/tests/basic/TestManyOnChildOfExtraJoin.java b/ebean-test/src/test/java/org/tests/basic/TestManyOnChildOfExtraJoin.java new file mode 100644 index 0000000000..e1198f3309 --- /dev/null +++ b/ebean-test/src/test/java/org/tests/basic/TestManyOnChildOfExtraJoin.java @@ -0,0 +1,55 @@ +package org.tests.basic; + +import io.ebean.DB; +import io.ebean.Query; +import io.ebean.xtest.BaseTestCase; +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.Test; +import org.tests.model.basic.Country; +import org.tests.model.basic.EBasic; +import org.tests.model.basic.OBeanChild; +import org.tests.model.basic.OCachedBean; +import org.tests.model.basic.ResetBasicData; + +public class TestManyOnChildOfExtraJoin extends BaseTestCase { + + + @Test + public void test() { + ResetBasicData.reset(); + + OCachedBean bean = new OCachedBean(); + bean.setName("m2m-with-sq"); + bean.getCountries().add(DB.reference(Country.class, "NZ")); + bean.getCountries().add(DB.reference(Country.class, "AU")); + DB.save(bean); + + OBeanChild child = new OBeanChild(); + child.setCachedBean(bean); + DB.save(child); + + EBasic b1 = new EBasic(); + b1.setName("Australia"); + b1.setStatus(EBasic.Status.ACTIVE); + DB.save(b1); + + EBasic b2 = new EBasic(); + b2.setName("New Zealand"); + b2.setStatus(EBasic.Status.ACTIVE); + DB.save(b2); + + Query query = DB.find(OBeanChild.class).where() + .eq("cachedBean.name", "m2m-with-sq") + .exists(DB.find(EBasic.class) + .alias("sq1") + .where() + .raw("cachedBean.countries.name = sq1.name") + .eq("status", EBasic.Status.ACTIVE) + .query()) + .query(); + SoftAssertions softly = new SoftAssertions(); + softly.assertThat(query.findList()).hasSize(1); + softly.assertThat(query.getGeneratedSql()).startsWith("select distinct"); + softly.assertAll(); + } +} diff --git a/ebean-test/src/test/java/org/tests/query/joins/TestQueryJoinOnFormula.java b/ebean-test/src/test/java/org/tests/query/joins/TestQueryJoinOnFormula.java index e757bbce55..a2fbbf2d91 100644 --- a/ebean-test/src/test/java/org/tests/query/joins/TestQueryJoinOnFormula.java +++ b/ebean-test/src/test/java/org/tests/query/joins/TestQueryJoinOnFormula.java @@ -82,7 +82,7 @@ public void testOrderOnChainedFormulaProperty() { .orderBy().asc("order.totalAmount"); shipQuery.findList(); - assertSql(shipQuery.getGeneratedSql()).isEqualTo("select t0.id " + assertSql(shipQuery.getGeneratedSql()).isEqualTo("select distinct t0.id, z_bt1.total_amount " + "from or_order_ship t0 " + "left join o_order t1 on t1.id = t0.order_id " + "left join (select order_id, count(*) as total_items, sum(order_qty*unit_price) as total_amount from o_order_detail group by order_id) z_bt1 on z_bt1.order_id = t1.id " @@ -99,7 +99,7 @@ public void testWhereOnChainedFormulaProperty() { .where().isNotNull("order.totalAmount").query(); shipQuery.findList(); - assertSql(shipQuery.getGeneratedSql()).isEqualTo("select t0.id " + assertSql(shipQuery.getGeneratedSql()).isEqualTo("select distinct t0.id " + "from or_order_ship t0 " + "left join o_order t1 on t1.id = t0.order_id " + "left join (select order_id, count(*) as total_items, sum(order_qty*unit_price) as total_amount from o_order_detail group by order_id) z_bt1 on z_bt1.order_id = t1.id " @@ -313,7 +313,7 @@ public void test_ChildPersonParentFindIds() { List loggedSql = LoggedSql.stop(); assertEquals(1, loggedSql.size()); assertThat(loggedSql.get(0)) - .contains("select t0.identifier from child_person t0") + .contains("select distinct t0.identifier from child_person t0") .contains("left join (select i2.parent_identifier") .contains("where coalesce(f2.child_age, 0) = ?"); } @@ -329,8 +329,8 @@ public void test_ChildPersonParentFindCount() { List loggedSql = LoggedSql.stop(); assertEquals(1, loggedSql.size()); - assertThat(loggedSql.get(0)).contains("select count(*) from child_person t0 left join parent_person t1 on t1.identifier = t0.parent_identifier"); - assertThat(loggedSql.get(0)).contains("where coalesce(f2.child_age, 0) = ?"); + assertThat(loggedSql.get(0)).contains("select count(*) from ( select distinct t0.identifier from child_person t0 left join parent_person t1 on t1.identifier = t0.parent_identifier"); + assertThat(loggedSql.get(0)).contains("where coalesce(f2.child_age, 0) = ?)"); } @Test