package com.avaje.ebeaninternal.server.autofetch; import java.util.List; import java.util.Set; import org.avaje.ebeantest.LoggedSqlCollector; import org.junit.Assert; import org.junit.Test; import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; import com.avaje.ebean.EbeanServer; import com.avaje.ebean.Query; import com.avaje.ebean.bean.EntityBean; import com.avaje.ebean.bean.EntityBeanIntercept; import com.avaje.tests.model.basic.Address; import com.avaje.tests.model.basic.Customer; import com.avaje.tests.model.basic.ResetBasicData; public class TunedQueryWithNullFetchedBeanTest extends BaseTestCase { EbeanServer server = Ebean.getServer(null); @Test public void withFetchOfNullBeanJoin() { ResetBasicData.reset(); Customer newCustomer = new Customer(); newCustomer.setName("TestFetchBillingAddress"); server.save(newCustomer); Query query = server.find(Customer.class) .setId(newCustomer.getId()) .fetch("billingAddress","id"); LoggedSqlCollector.start(); Customer customer = query.findUnique(); EntityBean eb = (EntityBean)customer; EntityBeanIntercept ebi = eb._ebean_getIntercept(); Assert.assertTrue(ebi.isFullyLoadedBean()); // find the internal property index for "billingAddress" String[] propNames = eb._ebean_getPropertyNames(); int pos = 0; for (int i = 0; i < propNames.length; i++) { if (propNames[i].equals("billingAddress")) { pos = i; } } // The billing address is loaded (but value null) Assert.assertTrue(ebi.isLoadedProperty(pos)); Set loadedPropertyNames = ebi.getLoadedPropertyNames(); Assert.assertNull(loadedPropertyNames); // no lazy loading expected here, value is null Address billingAddress = customer.getBillingAddress(); Assert.assertNull(billingAddress); // assert only one query executed List loggedSql = LoggedSqlCollector.stop(); Assert.assertEquals(1, loggedSql.size()); } }