Skip to content

Commit 0aad35b

Browse files
committed
Merge branch 'master' of github.com:ebean-orm/ebean
2 parents e7979b2 + 91920b0 commit 0aad35b

File tree

3 files changed

+64
-6
lines changed

3 files changed

+64
-6
lines changed

ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ final class SqlTreeNodeExtraJoin implements SqlTreeNode {
2525
private final STreePropertyAssoc assocBeanProperty;
2626
private final SpiQuery.TemporalMode temporalMode;
2727
private final String prefix;
28-
private final boolean manyJoin;
28+
private boolean manyJoin;
2929
private final boolean pathContainsMany;
3030
private List<SqlTreeNode> children;
3131

@@ -96,6 +96,9 @@ public void addChild(SqlTreeNode child) {
9696
if (children == null) {
9797
children = new ArrayList<>();
9898
}
99+
if (child.hasMany()) {
100+
manyJoin = true;
101+
}
99102
children.add(child);
100103
}
101104

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.tests.basic;
2+
3+
import io.ebean.DB;
4+
import io.ebean.Query;
5+
import io.ebean.xtest.BaseTestCase;
6+
import org.assertj.core.api.SoftAssertions;
7+
import org.junit.jupiter.api.Test;
8+
import org.tests.model.basic.Country;
9+
import org.tests.model.basic.EBasic;
10+
import org.tests.model.basic.OBeanChild;
11+
import org.tests.model.basic.OCachedBean;
12+
import org.tests.model.basic.ResetBasicData;
13+
14+
public class TestManyOnChildOfExtraJoin extends BaseTestCase {
15+
16+
17+
@Test
18+
public void test() {
19+
ResetBasicData.reset();
20+
21+
OCachedBean bean = new OCachedBean();
22+
bean.setName("m2m-with-sq");
23+
bean.getCountries().add(DB.reference(Country.class, "NZ"));
24+
bean.getCountries().add(DB.reference(Country.class, "AU"));
25+
DB.save(bean);
26+
27+
OBeanChild child = new OBeanChild();
28+
child.setCachedBean(bean);
29+
DB.save(child);
30+
31+
EBasic b1 = new EBasic();
32+
b1.setName("Australia");
33+
b1.setStatus(EBasic.Status.ACTIVE);
34+
DB.save(b1);
35+
36+
EBasic b2 = new EBasic();
37+
b2.setName("New Zealand");
38+
b2.setStatus(EBasic.Status.ACTIVE);
39+
DB.save(b2);
40+
41+
Query<OBeanChild> query = DB.find(OBeanChild.class).where()
42+
.eq("cachedBean.name", "m2m-with-sq")
43+
.exists(DB.find(EBasic.class)
44+
.alias("sq1")
45+
.where()
46+
.raw("cachedBean.countries.name = sq1.name")
47+
.eq("status", EBasic.Status.ACTIVE)
48+
.query())
49+
.query();
50+
SoftAssertions softly = new SoftAssertions();
51+
softly.assertThat(query.findList()).hasSize(1);
52+
softly.assertThat(query.getGeneratedSql()).startsWith("select distinct");
53+
softly.assertAll();
54+
}
55+
}

ebean-test/src/test/java/org/tests/query/joins/TestQueryJoinOnFormula.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public void testOrderOnChainedFormulaProperty() {
8585
.orderBy().asc("order.totalAmount");
8686

8787
shipQuery.findList();
88-
assertSql(shipQuery.getGeneratedSql()).isEqualTo("select t0.id "
88+
assertSql(shipQuery.getGeneratedSql()).isEqualTo("select distinct t0.id, z_bt1.total_amount "
8989
+ "from or_order_ship t0 "
9090
+ "left join o_order t1 on t1.id = t0.order_id "
9191
+ "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 "
@@ -102,7 +102,7 @@ public void testWhereOnChainedFormulaProperty() {
102102
.where().isNotNull("order.totalAmount").query();
103103

104104
shipQuery.findList();
105-
assertSql(shipQuery.getGeneratedSql()).isEqualTo("select t0.id "
105+
assertSql(shipQuery.getGeneratedSql()).isEqualTo("select distinct t0.id "
106106
+ "from or_order_ship t0 "
107107
+ "left join o_order t1 on t1.id = t0.order_id "
108108
+ "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 "
@@ -316,7 +316,7 @@ public void test_ChildPersonParentFindIds() {
316316
List<String> loggedSql = LoggedSql.stop();
317317
assertEquals(1, loggedSql.size());
318318
assertThat(loggedSql.get(0))
319-
.contains("select t0.identifier from child_person t0")
319+
.contains("select distinct t0.identifier from child_person t0")
320320
.contains("left join (select i2.parent_identifier")
321321
.contains("where coalesce(f2.child_age, 0) = ?");
322322
}
@@ -332,8 +332,8 @@ public void test_ChildPersonParentFindCount() {
332332

333333
List<String> loggedSql = LoggedSql.stop();
334334
assertEquals(1, loggedSql.size());
335-
assertThat(loggedSql.get(0)).contains("select count(*) from child_person t0 left join parent_person t1 on t1.identifier = t0.parent_identifier");
336-
assertThat(loggedSql.get(0)).contains("where coalesce(f2.child_age, 0) = ?");
335+
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");
336+
assertThat(loggedSql.get(0)).contains("where coalesce(f2.child_age, 0) = ?)");
337337
}
338338

339339
/**

0 commit comments

Comments
 (0)