package org.tests.query.embedded;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.ExpressionList;
import org.hamcrest.core.Is;
import org.junit.Assert;
import org.junit.Test;
import org.tests.model.embedded.EEmbDatePeriod;
import org.tests.model.embedded.EEmbInner;
import org.tests.model.embedded.EEmbOuter;
import java.util.Date;
import java.util.List;
/**
* Test that selecting A and filtering on 'B.C=some_value' will correctly create join on table for B.
* Model:
* - Bean A has relation to bean B
* - Bean B has an embedded property C
*/
public class TestFilteringByEmbeddedInJoinedTable extends BaseTestCase {
private EEmbOuter createOuter(String nomeOuter, Date date1, Date date2) {
EEmbOuter outer1 = new EEmbOuter();
outer1.setNomeOuter(nomeOuter);
EEmbDatePeriod eEmbDatePeriod = new EEmbDatePeriod();
eEmbDatePeriod.setDate1(date1);
eEmbDatePeriod.setDate2(date2);
outer1.setDatePeriod(eEmbDatePeriod);
Ebean.save(outer1);
return outer1;
}
@Test
public void testOuterTableJoined() {
EEmbOuter outer1 = createOuter("outer1", new Date(11111), new Date(12222));
// Unused outer2 just to populate the DB
EEmbOuter outer2 = createOuter("outer2", new Date(21111), new Date(22222));
EEmbOuter outer3 = createOuter("outer3", new Date(31111), new Date(32222));
EEmbInner inner1 = new EEmbInner();
inner1.setOuter(outer1);
inner1.setNomeInner("inner1-1");
Ebean.save(inner1);
EEmbInner inner2 = new EEmbInner();
// Setting outer1 also here
inner2.setOuter(outer1);
inner2.setNomeInner("inner2-1");
Ebean.save(inner2);
EEmbInner inner3 = new EEmbInner();
inner3.setOuter(outer3);
inner3.setNomeInner("inner3-3");
Ebean.save(inner3);
ExpressionList<EEmbInner> el = Ebean.find(EEmbInner.class).where()
.eq("outer.datePeriod.date1", new Date(11111));
List<EEmbInner> list = el.findList();
Assert.assertThat(list.size(), Is.is(2));
}
}