Merge pull request #3348 from ebean-orm/feature/3313-fetchGroup-with-config

#3313 Ability to configure fetch batch size when using FetchGroups and query beans
This commit is contained in:
Rob Bygrave
2024-03-03 13:53:52 +13:00
committed by GitHub
2 changed files with 35 additions and 0 deletions
@@ -108,6 +108,18 @@ public abstract class TQAssocBean<T, R, QB> extends TQAssoc<T, R> {
return fetchWithProperties(FETCH_DEFAULT, properties);
}
/**
* Fetch this association with config for the type of fetch and the specified properties.
*
* @param config Fetch configuration to define the type of fetch to use
* @param properties The properties to fetch
*/
@SafeVarargs @SuppressWarnings("varargs")
public final R fetch(FetchConfig config, TQProperty<QB,?>... properties) {
return fetchWithProperties(config, properties);
}
/**
* Eagerly fetch this association using a 'query join' loading the specified properties.
*/
@@ -1,6 +1,7 @@
package org.querytest;
import io.ebean.DB;
import io.ebean.FetchConfig;
import io.ebean.FetchGroup;
import io.ebean.Query;
import io.ebean.test.LoggedSql;
@@ -8,6 +9,7 @@ import org.example.domain.Customer;
import org.example.domain.Order;
import org.example.domain.OrderDetail;
import org.example.domain.otherpackage.PhoneNumber;
import org.example.domain.query.QContact;
import org.example.domain.query.QCustomer;
import org.example.domain.query.QOrder;
import org.example.domain.query.QOrderDetail;
@@ -26,10 +28,17 @@ public class QOrderTest {
private static final QOrder or = QOrder.alias();
private static final QContact co = QContact.alias();
private static final FetchGroup<Customer> fgC = QCustomer.forFetchGroup()
.select(cu.name, cu.phoneNumber)
.buildFetchGroup();
private static final FetchGroup<Customer> fgCustomerWithContacts = QCustomer.forFetchGroup()
.select(cu.name, cu.phoneNumber)
.contacts.fetch(FetchConfig.ofQuery(1000), co.firstName, co.lastName, co.email)
.buildFetchGroup();
private static final FetchGroup<Order> fgNested1 = QOrder.forFetchGroup()
.select(or.status, or.shipDate)
.customer.fetch(fgC)
@@ -70,6 +79,20 @@ public class QOrderTest {
DB.delete(customer);
}
@Test
void fetchQueryWithBatch() {
LoggedSql.start();
new QCustomer()
.select(fgCustomerWithContacts)
.findList();
final List<String> sql = LoggedSql.stop();
assertThat(sql).hasSize(2);
assertThat(sql.get(0)).contains("select t0.id, t0.name, t0.phone_number from be_customer t0");
assertThat(sql.get(1)).contains("select t0.customer_id, t0.id, t0.first_name, t0.last_name, t0.email from be_contact t0 where");
}
@Test
public void fetchCache() {