package org.tests.batchload; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.FetchConfig; import org.tests.model.basic.Order; import org.tests.model.basic.OrderDetail; import org.tests.model.basic.ResetBasicData; import org.ebeantest.LoggedSqlCollector; import org.junit.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; public class TestQueryJoinToAssocOne extends BaseTestCase { @Test public void testQueryJoinOnFullyPopulatedParent() { ResetBasicData.reset(); LoggedSqlCollector.start(); // This will use 2 SQL queries to build this object graph List<Order> l0 = Ebean.find(Order.class) .fetch("details", "orderQty, unitPrice", new FetchConfig().query()) .fetch("details.product", "sku, name") .findList(); assertThat(l0).isNotEmpty(); List<String> loggedSql = LoggedSqlCollector.stop(); assertThat(loggedSql).hasSize(2); String secondaryQuery = trimSql(loggedSql.get(1), 1); assertThat(secondaryQuery).contains("select t0.order_id, t0.id,"); assertThat(secondaryQuery).contains(" from o_order_detail t0 left join o_product t1"); assertThat(secondaryQuery).contains(" (t0.order_id) in (?"); assertThat(secondaryQuery).contains(" order by t0.order_id, t0.id"); } @Test public void testQueryJoinOnPartiallyPopulatedParent() { ResetBasicData.reset(); LoggedSqlCollector.start(); // This will use 2 SQL queries to build this object graph List<Order> l0 = Ebean.find(Order.class) .select("status, shipDate") .fetch("details", "orderQty, unitPrice", new FetchConfig().query()) .fetch("details.product", "sku, name") .findList(); assertThat(l0).isNotEmpty(); List<String> loggedSql = LoggedSqlCollector.stop(); assertThat(loggedSql).hasSize(2); String secondaryQuery = trimSql(loggedSql.get(1), 1); assertThat(secondaryQuery).contains("select t0.order_id, t0.id,"); assertThat(secondaryQuery).contains(" from o_order_detail t0 left join o_product t1"); assertThat(secondaryQuery).contains(" (t0.order_id) in (?"); assertThat(secondaryQuery).contains(" order by t0.order_id, t0.id"); } @Test public void testQueryJoinOnPartiallyPopulatedParent_withLazyLoadingDisabled() { ResetBasicData.reset(); LoggedSqlCollector.start(); // This will use 2 SQL queries to build this object graph List<Order> l0 = Ebean.find(Order.class) .setDisableLazyLoading(true) .select("status, shipDate") .fetch("details", "orderQty, unitPrice", new FetchConfig().query()) .fetch("details.product", "sku, name") .order().asc("id") .findList(); assertThat(l0).isNotEmpty(); Order order = l0.get(0); // normally invokes lazy loading order.getOrderDate(); List<OrderDetail> details = order.getDetails(); OrderDetail orderDetail = details.get(0); // normally invokes lazy loading orderDetail.getShipQty(); // normally invokes lazy loading order.getShipments().size(); List<String> loggedSql = LoggedSqlCollector.stop(); assertThat(loggedSql).hasSize(2); String secondaryQuery = trimSql(loggedSql.get(1), 1); assertThat(secondaryQuery).contains("select t0.order_id, t0.id,"); assertThat(secondaryQuery).contains(" from o_order_detail t0 left join o_product t1"); assertThat(secondaryQuery).contains(" (t0.order_id) in (?"); assertThat(secondaryQuery).contains(" order by t0.order_id, t0.id"); } @Test public void testJoinOnPartiallyPopulatedParent_withLazyLoadingDisabled() { ResetBasicData.reset(); LoggedSqlCollector.start(); // This will use 2 SQL queries to build this object graph List<Order> l0 = Ebean.find(Order.class) .setDisableLazyLoading(true) .select("status, shipDate") .fetch("details", "orderQty, unitPrice")//, new FetchConfig().query()) .fetch("details.product", "sku, name") .findList(); assertThat(l0).isNotEmpty(); Order order = l0.get(0); // normally invokes lazy loading order.getOrderDate(); List<OrderDetail> details = order.getDetails(); OrderDetail orderDetail = details.get(0); // normally invokes lazy loading orderDetail.getShipQty(); List<String> loggedSql = LoggedSqlCollector.stop(); assertThat(loggedSql).hasSize(1); String originQuery = trimSql(loggedSql.get(0), 5); assertThat(originQuery).contains("select t0.id, t0.status, t0.ship_date, t1.id, t1.order_qty, t1.unit_price"); assertThat(originQuery).contains(" from o_order t0 left join o_order_detail t1 "); } }