diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index 897d1ab8c..10357797b 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -507,21 +507,22 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc { public String getAssocIsEmpty(SpiExpressionRequest request, String path) { StringBuilder sb = new StringBuilder(); - SpiQuery query = request.getQueryRequest().getQuery(); if (manyToMany) { sb.append(query.isAsDraft() ? intersectionDraftTable : intersectionPublishTable); } else { sb.append(targetDescriptor.getBaseTable(query.getTemporalMode())); } - sb.append(" where "); + sb.append(" x where "); for (int i = 0; i < exportedProperties.length; i++) { if (i > 0) { sb.append(" and "); } - exportedProperties[i].appendWhere(sb, path); + exportedProperties[i].appendWhere(sb, "x.", path); + } + if (targetDescriptor.isSoftDelete()) { + sb.append(" and ").append(targetDescriptor.getSoftDeletePredicate("x")); } - return sb.toString(); } diff --git a/src/main/java/io/ebeaninternal/server/deploy/ExportedProperty.java b/src/main/java/io/ebeaninternal/server/deploy/ExportedProperty.java index 164b2e3ac..235e89713 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/ExportedProperty.java +++ b/src/main/java/io/ebeaninternal/server/deploy/ExportedProperty.java @@ -53,8 +53,8 @@ public class ExportedProperty { /** * Append a logical where for the foreign db column to logical property name, */ - public void appendWhere(StringBuilder sb, String path) { - sb.append(foreignDbColumn).append(" = "); + public void appendWhere(StringBuilder sb, String alias, String path) { + sb.append(alias).append(foreignDbColumn).append(" = "); if (path != null) { sb.append(path).append("."); } diff --git a/src/test/java/io/ebean/UpdateQueryTest.java b/src/test/java/io/ebean/UpdateQueryTest.java index 6d7017f85..0a8e81fbc 100644 --- a/src/test/java/io/ebean/UpdateQueryTest.java +++ b/src/test/java/io/ebean/UpdateQueryTest.java @@ -91,7 +91,7 @@ public class UpdateQueryTest extends BaseTestCase { updateQuery.update(); - assertThat(updateQuery.getGeneratedSql()).contains("update o_customer set status=? where not exists (select 1 from contact where customer_id = id) and id > ?"); + assertThat(updateQuery.getGeneratedSql()).contains("update o_customer set status=? where not exists (select 1 from contact x where x.customer_id = id) and id > ?"); } @Test diff --git a/src/test/java/io/ebeaninternal/server/expression/IsEmptyExpressionQueryTest.java b/src/test/java/io/ebeaninternal/server/expression/IsEmptyExpressionQueryTest.java index 3222af9d0..feb486d84 100644 --- a/src/test/java/io/ebeaninternal/server/expression/IsEmptyExpressionQueryTest.java +++ b/src/test/java/io/ebeaninternal/server/expression/IsEmptyExpressionQueryTest.java @@ -23,7 +23,7 @@ public class IsEmptyExpressionQueryTest extends BaseTestCase { .query(); query.findList(); - assertThat(sqlOf(query)).contains("select t0.id from o_customer t0 where not exists (select 1 from contact where customer_id = t0.id"); + assertThat(sqlOf(query)).contains("select t0.id from o_customer t0 where not exists (select 1 from contact x where x.customer_id = t0.id"); } @Test @@ -37,7 +37,7 @@ public class IsEmptyExpressionQueryTest extends BaseTestCase { .query(); query.findList(); - assertThat(sqlOf(query)).contains("select t0.id from o_customer t0 where exists (select 1 from contact where customer_id = t0.id"); + assertThat(sqlOf(query)).contains("select t0.id from o_customer t0 where exists (select 1 from contact x where x.customer_id = t0.id"); } @Test @@ -51,7 +51,7 @@ public class IsEmptyExpressionQueryTest extends BaseTestCase { .query(); query.findList(); - assertThat(sqlOf(query)).contains("select t0.id from contact t0 where not exists (select 1 from contact_note where contact_id = t0.id"); + assertThat(sqlOf(query)).contains("select t0.id from contact t0 where not exists (select 1 from contact_note x where x.contact_id = t0.id"); } @Test @@ -65,7 +65,7 @@ public class IsEmptyExpressionQueryTest extends BaseTestCase { .query(); query.findList(); - assertThat(sqlOf(query)).contains("select t0.id from contact t0 where exists (select 1 from contact_note where contact_id = t0.id"); + assertThat(sqlOf(query)).contains("select t0.id from contact t0 where exists (select 1 from contact_note x where x.contact_id = t0.id"); } @@ -95,10 +95,10 @@ public class IsEmptyExpressionQueryTest extends BaseTestCase { query.findList(); if (isPostgres()) { - assertThat(sqlOf(query)).contains("select distinct on (t0.id) t0.id from o_customer t0 join contact u1 on u1.customer_id = t0.id where not exists (select 1 from contact_note where contact_id = u1.id)"); + assertThat(sqlOf(query)).contains("select distinct on (t0.id) t0.id from o_customer t0 join contact u1 on u1.customer_id = t0.id where not exists (select 1 from contact_note x where x.contact_id = u1.id)"); } else { - assertThat(sqlOf(query)).contains("select distinct t0.id from o_customer t0 join contact u1 on u1.customer_id = t0.id where not exists (select 1 from contact_note where contact_id = u1.id)"); + assertThat(sqlOf(query)).contains("select distinct t0.id from o_customer t0 join contact u1 on u1.customer_id = t0.id where not exists (select 1 from contact_note x where x.contact_id = u1.id)"); } } @@ -114,10 +114,10 @@ public class IsEmptyExpressionQueryTest extends BaseTestCase { query.findList(); if (isPostgres()) { - assertThat(sqlOf(query)).contains("select distinct on (t0.id) t0.id from o_customer t0 join contact u1 on u1.customer_id = t0.id where exists (select 1 from contact_note where contact_id = u1.id)"); + assertThat(sqlOf(query)).contains("select distinct on (t0.id) t0.id from o_customer t0 join contact u1 on u1.customer_id = t0.id where exists (select 1 from contact_note x where x.contact_id = u1.id)"); } else { - assertThat(sqlOf(query)).contains("select distinct t0.id from o_customer t0 join contact u1 on u1.customer_id = t0.id where exists (select 1 from contact_note where contact_id = u1.id)"); + assertThat(sqlOf(query)).contains("select distinct t0.id from o_customer t0 join contact u1 on u1.customer_id = t0.id where exists (select 1 from contact_note x where x.contact_id = u1.id)"); } } diff --git a/src/test/java/org/tests/query/TestManyWhereJoinM2M.java b/src/test/java/org/tests/query/TestManyWhereJoinM2M.java index 567a189e4..c68aa823d 100644 --- a/src/test/java/org/tests/query/TestManyWhereJoinM2M.java +++ b/src/test/java/org/tests/query/TestManyWhereJoinM2M.java @@ -76,7 +76,7 @@ public class TestManyWhereJoinM2M extends BaseTestCase { List 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(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 x where x.muser_userid = t0.userid)"); assertThat(usersWithNoRoles).isNotEmpty(); } @@ -89,7 +89,7 @@ public class TestManyWhereJoinM2M extends BaseTestCase { List 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(sqlOf(query, 1)).contains("select t0.userid, t0.user_name from muser t0 where exists (select 1 from mrole_muser x where x.muser_userid = t0.userid)"); assertThat(usersWithRoles).isNotEmpty(); } } diff --git a/src/test/java/org/tests/query/TestQueryIsNull.java b/src/test/java/org/tests/query/TestQueryIsNull.java index 24390207a..d2689337b 100644 --- a/src/test/java/org/tests/query/TestQueryIsNull.java +++ b/src/test/java/org/tests/query/TestQueryIsNull.java @@ -30,7 +30,7 @@ public class TestQueryIsNull extends BaseTestCase { Query query = Ebean.find(Order.class).where().isNotNull("details").query(); query.findList(); - assertTrue(query.getGeneratedSql().contains(" where exists (select 1 from o_order_detail where order_id = t0.id)")); + assertTrue(query.getGeneratedSql().contains(" where exists (select 1 from o_order_detail x where x.order_id = t0.id)")); } @Test @@ -40,7 +40,7 @@ public class TestQueryIsNull extends BaseTestCase { Query query = Ebean.find(Order.class).where().isNotEmpty("details").query(); query.findList(); - assertTrue(query.getGeneratedSql().contains(" where exists (select 1 from o_order_detail where order_id = t0.id)")); + assertTrue(query.getGeneratedSql().contains(" where exists (select 1 from o_order_detail x where x.order_id = t0.id)")); } @Test @@ -50,7 +50,7 @@ public class TestQueryIsNull extends BaseTestCase { Query query = Ebean.find(Order.class).where().isNull("details").query(); query.findList(); - assertTrue(query.getGeneratedSql().contains(" where not exists (select 1 from o_order_detail where order_id = t0.id)")); + assertTrue(query.getGeneratedSql().contains(" where not exists (select 1 from o_order_detail x where x.order_id = t0.id)")); } @Test @@ -60,7 +60,7 @@ public class TestQueryIsNull extends BaseTestCase { Query query = Ebean.find(Order.class).where().isEmpty("details").query(); query.findList(); - assertTrue(query.getGeneratedSql().contains(" where not exists (select 1 from o_order_detail where order_id = t0.id)")); + assertTrue(query.getGeneratedSql().contains(" where not exists (select 1 from o_order_detail x where x.order_id = t0.id)")); } @Test @@ -70,7 +70,7 @@ public class TestQueryIsNull extends BaseTestCase { Query query = Ebean.find(Role.class).where().isEmpty("permissions").query(); query.findList(); - assertTrue(query.getGeneratedSql().contains("from mt_role t0 where not exists (select 1 from mt_role_permission where mt_role_id = t0.id)")); + assertTrue(query.getGeneratedSql().contains("from mt_role t0 where not exists (select 1 from mt_role_permission x where x.mt_role_id = t0.id)")); } @Test @@ -80,7 +80,7 @@ public class TestQueryIsNull extends BaseTestCase { Query query = Ebean.find(Role.class).where().isNull("permissions").query(); query.findList(); - assertTrue(query.getGeneratedSql().contains("from mt_role t0 where not exists (select 1 from mt_role_permission where mt_role_id = t0.id)")); + assertTrue(query.getGeneratedSql().contains("from mt_role t0 where not exists (select 1 from mt_role_permission x where x.mt_role_id = t0.id)")); } @Test @@ -90,7 +90,7 @@ public class TestQueryIsNull extends BaseTestCase { Query query = Ebean.find(Role.class).where().isNotEmpty("permissions").query(); query.findList(); - assertTrue(query.getGeneratedSql().contains("from mt_role t0 where exists (select 1 from mt_role_permission where mt_role_id = t0.id)")); + assertTrue(query.getGeneratedSql().contains("from mt_role t0 where exists (select 1 from mt_role_permission x where x.mt_role_id = t0.id)")); } @Test @@ -100,7 +100,7 @@ public class TestQueryIsNull extends BaseTestCase { Query query = Ebean.find(Role.class).where().isNotNull("permissions").query(); query.findList(); - assertTrue(query.getGeneratedSql().contains("from mt_role t0 where exists (select 1 from mt_role_permission where mt_role_id = t0.id)")); + assertTrue(query.getGeneratedSql().contains("from mt_role t0 where exists (select 1 from mt_role_permission x where x.mt_role_id = t0.id)")); } } diff --git a/src/test/java/org/tests/softdelete/TestSoftDeleteTop.java b/src/test/java/org/tests/softdelete/TestSoftDeleteTop.java index 9b162140f..8e46270bd 100644 --- a/src/test/java/org/tests/softdelete/TestSoftDeleteTop.java +++ b/src/test/java/org/tests/softdelete/TestSoftDeleteTop.java @@ -2,6 +2,7 @@ package org.tests.softdelete; import io.ebean.BaseTestCase; import io.ebean.Ebean; +import io.ebean.Query; import io.ebean.Transaction; import io.ebean.annotation.PersistBatch; import org.tests.model.softdelete.ESoftDelMid; @@ -12,6 +13,8 @@ import org.junit.Test; import java.util.ArrayList; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; + public class TestSoftDeleteTop extends BaseTestCase { @Test @@ -89,4 +92,22 @@ public class TestSoftDeleteTop extends BaseTestCase { Ebean.deletePermanent(top1); } + @Test + public void testWhereNull() { + + ESoftDelTop top1 = new ESoftDelTop("top1"); + top1.addMids("mid1"); + top1.addMids("mid2"); + + Ebean.save(top1); + + Query query = Ebean.find(ESoftDelTop.class) + .where().isEmpty("mids") + .query(); + + query.findList(); + + assertThat(sqlOf(query)).contains("where not exists (select 1 from esoft_del_mid x where x.top_id = t0.id and x.deleted =)"); + } + }