From 492bb98e0ef0054059e869badba20987b1786cbf Mon Sep 17 00:00:00 2001 From: rbygrave Date: Thu, 22 Jul 2021 17:12:06 +1200 Subject: [PATCH] #2269 - findSingleAttributeList does not filter soft-deleted record --- .../server/query/CQueryBuilder.java | 6 +++ .../tests/softdelete/TestSoftDeleteBasic.java | 46 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java index 1162e914d..41439e4b6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java @@ -189,6 +189,12 @@ class CQueryBuilder { SpiQuery query = request.getQuery(); query.setSingleAttribute(); + if (!query.isIncludeSoftDeletes()) { + BeanDescriptor desc = request.getBeanDescriptor(); + if (desc.isSoftDelete()) { + query.addSoftDeletePredicate(desc.getSoftDeletePredicate(alias(query.getAlias()))); + } + } CQueryPredicates predicates = new CQueryPredicates(binder, request); CQueryPlan queryPlan = request.getQueryPlan(); diff --git a/ebean-core/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java b/ebean-core/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java index 1dfec06c4..3364417b9 100644 --- a/ebean-core/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java +++ b/ebean-core/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java @@ -58,6 +58,52 @@ public class TestSoftDeleteBasic extends BaseTestCase { } + @Test + public void findSingleAttribute() { + + EBasicSoftDelete bean = new EBasicSoftDelete(); + bean.setName("findSingleAttribute"); + DB.save(bean); + + LoggedSqlCollector.start(); + + final String name0 = DB.find(EBasicSoftDelete.class) + .select("name") + .where().eq("name", "findSingleAttribute") + .findSingleAttribute(); + + List sql0 = LoggedSqlCollector.current(); + assertThat(sql0.get(0)).contains("where t0.name = ? and t0.deleted ="); + assertThat(name0).isEqualTo("findSingleAttribute"); + + // now soft delete the bean + DB.delete(bean); + List sqlUpdate = LoggedSqlCollector.current(); + assertThat(sqlUpdate.get(0)).contains("update ebasic_sdchild set"); + + // use setIncludeSoftDeletes + final String name1 = DB.find(EBasicSoftDelete.class) + .select("name") + .where().eq("name", "findSingleAttribute") + .setIncludeSoftDeletes() + .findSingleAttribute(); + + List sql1 = LoggedSqlCollector.current(); + assertThat(sql1.get(0)).doesNotContain(" and t0.deleted ="); + assertThat(name1).isEqualTo("findSingleAttribute"); + + + // not using setIncludeSoftDeletes, so don't find it + final String name2 = DB.find(EBasicSoftDelete.class) + .select("name") + .where().eq("name", "findSingleAttribute") + .findSingleAttribute(); + + List sql2 = LoggedSqlCollector.stop(); + assertThat(sql2.get(0)).contains(" and t0.deleted ="); + assertThat(name2).isNull(); + } + @Test public void testFindIdsWhenIncludeSoftDeletedChlld() {