package org.tests.query; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.Query; import org.tests.model.basic.MRole; import org.tests.model.basic.MUser; import org.junit.Assert; import org.junit.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; public class TestManyWhereJoinM2M extends BaseTestCase { @Test public void test() { Ebean.beginTransaction(); MRole r1 = new MRole(); r1.setRoleName("role1"); Ebean.save(r1); MRole r2 = new MRole(); r2.setRoleName("role2special"); Ebean.save(r2); MRole r3 = new MRole(); r3.setRoleName("role3"); Ebean.save(r3); MUser u0 = new MUser(); u0.setUserName("user0"); u0.addRole(r1); u0.addRole(r2); Ebean.save(u0); MUser u1 = new MUser(); u1.setUserName("user1"); u1.addRole(r1); Ebean.save(u1); MUser u2 = new MUser(); u2.setUserName("user2"); Ebean.save(u2); Ebean.commitTransaction(); Query<MUser> query = Ebean.find(MUser.class).fetch("roles") // the where on a 'many' (like orders) requires an // additional join and distinct which is independent // of a fetch join (if there is a fetch join) .where().eq("roles.roleName", "role2special").query(); query.findList(); String sql = query.getGeneratedSql(); Assert.assertTrue(sql.contains("select distinct")); Assert.assertTrue(sql.contains("left join mrole ")); Assert.assertTrue(sql.contains("join mrole ")); Assert.assertTrue(sql.contains(".role_name = ?")); isEmpty(); isNotEmpty(); } private void isEmpty() { Query<MUser> query = Ebean.find(MUser.class) .where().isEmpty("roles") .query(); List<MUser> usersWithNoRoles = query.findList(); assertThat(sqlOf(query, 2)).contains("select t0.userid, t0.user_name, t0.user_type_id from muser t0 where not exists (select 1 from mrole_muser where muser_userid = t0.userid)"); assertThat(usersWithNoRoles).isNotEmpty(); } private void isNotEmpty() { Query<MUser> query = Ebean.find(MUser.class) .select("userName") .where().isNotEmpty("roles") .query(); List<MUser> usersWithRoles = query.findList(); assertThat(sqlOf(query, 1)).contains("select t0.userid, t0.user_name from muser t0 where exists (select 1 from mrole_muser where muser_userid = t0.userid)"); assertThat(usersWithRoles).isNotEmpty(); } }