Skip to content

Commit fee6e0f

Browse files
committed
Tests only - new test on multiple many joins
This test reproduce the problem of #3573 The field initialization `= List.of();` prevents eager secondary query.
1 parent 11e7839 commit fee6e0f

File tree

5 files changed

+136
-0
lines changed

5 files changed

+136
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.tests.model.join.initfields;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.Id;
5+
import jakarta.persistence.OneToMany;
6+
import jakarta.persistence.Table;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
@Entity
12+
@Table(name = "join_initfields_order")
13+
public class Order {
14+
@Id
15+
int id;
16+
17+
@OneToMany
18+
public List<OrderItem> orderItems = new ArrayList<>();
19+
20+
@OneToMany
21+
public List<OrderDetail> orderDetails = new ArrayList<>();
22+
23+
@OneToMany
24+
public List<OrderInvoice> orderInvoices = List.of(); // Change this to new ArrayList<>() to make the test pass.
25+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.tests.model.join.initfields;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.Id;
5+
import jakarta.persistence.ManyToOne;
6+
import jakarta.persistence.Table;
7+
8+
@Entity
9+
@Table(name="join_initfields_order_detail")
10+
public class OrderDetail {
11+
@Id
12+
int id;
13+
14+
@ManyToOne
15+
public Order order;
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.tests.model.join.initfields;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.Id;
5+
import jakarta.persistence.ManyToOne;
6+
import jakarta.persistence.Table;
7+
8+
@Entity
9+
@Table(name="join_initfields_order_invoice")
10+
public class OrderInvoice {
11+
@Id
12+
int id;
13+
14+
@ManyToOne
15+
public Order order;
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.tests.model.join.initfields;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.Id;
5+
import jakarta.persistence.ManyToOne;
6+
import jakarta.persistence.Table;
7+
8+
@Entity
9+
@Table(name="join_initfields_order_item")
10+
public class OrderItem {
11+
@Id
12+
int id;
13+
14+
@ManyToOne
15+
public Order order;
16+
}

ebean-test/src/test/java/org/tests/query/TestQueryMultiJoinFetchPath.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package org.tests.query;
22

3+
import io.ebean.test.LoggedSql;
34
import io.ebean.xtest.BaseTestCase;
45
import io.ebean.DB;
56
import io.ebean.Query;
67
import org.junit.jupiter.api.Test;
78
import org.tests.model.join.*;
9+
import org.tests.model.join.initfields.Order;
10+
import org.tests.model.join.initfields.OrderDetail;
11+
import org.tests.model.join.initfields.OrderInvoice;
12+
import org.tests.model.join.initfields.OrderItem;
813

914
import java.util.List;
1015

1116
import static org.assertj.core.api.Assertions.assertThat;
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
1218

1319
class TestQueryMultiJoinFetchPath extends BaseTestCase {
1420

@@ -65,4 +71,61 @@ void test() {
6571
}
6672
}
6773

74+
@Test
75+
public void test_manyNonRoot_RootHasNoMany() {
76+
Order o = new Order();
77+
DB.save(o);
78+
79+
OrderItem p1 = new OrderItem();
80+
p1.order = o;
81+
DB.save(p1);
82+
83+
OrderItem p2 = new OrderItem();
84+
p2.order = o;
85+
DB.save(p2);
86+
87+
OrderDetail d1 = new OrderDetail();
88+
d1.order = o;
89+
DB.save(d1);
90+
91+
OrderDetail d2 = new OrderDetail();
92+
d2.order = o;
93+
DB.save(d2);
94+
95+
OrderInvoice i1 = new OrderInvoice();
96+
i1.order = o;
97+
DB.save(i1);
98+
99+
OrderInvoice i2 = new OrderInvoice();
100+
i2.order = o;
101+
DB.save(i2);
102+
103+
// This first query behaves as expected: a main query and its secondary query.
104+
LoggedSql.start();
105+
List<Order> list1 = DB.find(Order.class)
106+
.fetch("orderItems")
107+
.fetch("orderDetails")
108+
.where().gt("id", 0)
109+
.findList();
110+
111+
assertEquals(2, list1.get(0).orderItems.size());
112+
assertEquals(2, list1.get(0).orderDetails.size());
113+
114+
List<String> sql1 = LoggedSql.stop();
115+
assertEquals(2, sql1.size());
116+
117+
// This query does not eager fetch invoices. We get an NPE on orderInvoices. Only the main query is executed.
118+
LoggedSql.start();
119+
List<Order> list2 = DB.find(Order.class)
120+
.fetch("orderItems")
121+
.fetch("orderInvoices")
122+
.where().gt("id", 0)
123+
.findList();
124+
125+
assertEquals(2, list2.get(0).orderItems.size());
126+
assertEquals(2, list2.get(0).orderInvoices.size());
127+
128+
List<String> sql2 = LoggedSql.stop();
129+
assertEquals(2, sql2.size());
130+
}
68131
}

0 commit comments

Comments
 (0)