diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index 0eaf2ae01..2058f0e56 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -318,11 +318,11 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST /** * Find the Id's of detail beans given a parent Id or list of parent Id's. */ - public List findIdsByParentId(Object parentId, List parentIdList, Transaction t, List excludeDetailIds) { + public List findIdsByParentId(Object parentId, List parentIdList, Transaction t, List excludeDetailIds, boolean hard) { if (parentId != null) { - return sqlHelp.findIdsByParentId(parentId, t, excludeDetailIds); + return sqlHelp.findIdsByParentId(parentId, t, excludeDetailIds, hard); } else { - return sqlHelp.findIdsByParentIdList(parentIdList, t, excludeDetailIds); + return sqlHelp.findIdsByParentIdList(parentIdList, t, excludeDetailIds, hard); } } diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java index 3b3426aa3..7f58aa511 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java @@ -127,14 +127,16 @@ class BeanPropertyAssocManySqlHelp { many.bindParentIdsIn(expr, parentIds, query); } - List findIdsByParentId(Object parentId, Transaction t, List excludeDetailIds) { + List findIdsByParentId(Object parentId, Transaction t, List excludeDetailIds, boolean hard) { String rawWhere = deriveWhereParentIdSql(false, ""); SpiEbeanServer server = descriptor.getEbeanServer(); SpiQuery q = many.newQuery(server); many.bindParentIdEq(rawWhere, parentId, q); - + if (hard) { + q.setIncludeSoftDeletes(); + } if (excludeDetailIds != null && !excludeDetailIds.isEmpty()) { q.where().not(q.getExpressionFactory().idIn(excludeDetailIds)); } @@ -142,7 +144,7 @@ class BeanPropertyAssocManySqlHelp { return server.findIds(q, t); } - List findIdsByParentIdList(List parentIds, Transaction t, List excludeDetailIds) { + List findIdsByParentIdList(List parentIds, Transaction t, List excludeDetailIds, boolean hard) { String rawWhere = deriveWhereParentIdSql(true, ""); String inClause = buildInClauseBinding(parentIds.size(), exportedPropertyBindProto); @@ -153,7 +155,9 @@ class BeanPropertyAssocManySqlHelp { SpiQuery q = many.newQuery(server); //Query q = server.find(propertyType); many.bindParentIdsIn(expr, parentIds, q); - + if (hard) { + q.setIncludeSoftDeletes(); + } if (excludeDetailIds != null && !excludeDetailIds.isEmpty()) { q.where().not(q.getExpressionFactory().idIn(excludeDetailIds)); } diff --git a/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java b/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java index 0e402dcdc..884997f65 100644 --- a/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java +++ b/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java @@ -754,7 +754,7 @@ public final class DefaultPersister implements Persister { executeSqlUpdate(sqlDelete, t); } else { // we need to fetch the Id's to delete (recurse or notify L2 cache) - List childIds = many.findIdsByParentId(id, idList, t, null); + List childIds = many.findIdsByParentId(id, idList, t, null, deleteMode.isHard()); if (!childIds.isEmpty()) { delete(targetDesc, null, childIds, t, deleteMode); } @@ -1052,7 +1052,7 @@ public final class DefaultPersister implements Persister { } else { // Delete recurse using the Id values of the children Object parentId = desc.getId(parentBean); - List idsByParentId = many.findIdsByParentId(parentId, null, t, excludeDetailIds); + List idsByParentId = many.findIdsByParentId(parentId, null, t, excludeDetailIds, deleteMode.isHard()); if (!idsByParentId.isEmpty()) { deleteChildrenById(t, targetDesc, idsByParentId, deleteMode); } diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java index e1f4b2249..a58c7b6ec 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java @@ -214,7 +214,7 @@ class CQueryBuilder { SpiQuery query = request.getQuery(); query.setSelectId(); BeanDescriptor desc = request.getBeanDescriptor(); - if (desc.isSoftDelete()) { + if (!query.isIncludeSoftDeletes() && desc.isSoftDelete()) { query.addSoftDeletePredicate(desc.getSoftDeletePredicate(alias(query.getAlias()))); } return buildFetchAttributeQuery(request); diff --git a/src/test/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyTest.java b/src/test/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyTest.java index 162832e76..ff35bf77e 100644 --- a/src/test/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyTest.java +++ b/src/test/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyTest.java @@ -72,9 +72,9 @@ public class BeanPropertyAssocManyTest extends BaseTestCase { customerIds.add(1L); customerIds.add(2L); - List contactIdsForOne = contacts().findIdsByParentId(1L, null, null, null); + List contactIdsForOne = contacts().findIdsByParentId(1L, null, null, null, true); - List contactIdsForMultiple = contacts().findIdsByParentId(null, customerIds, null, null); + List contactIdsForMultiple = contacts().findIdsByParentId(null, customerIds, null, null, true); assertThat(contactIdsForOne).isNotEmpty(); assertThat(contactIdsForMultiple).isNotEmpty(); diff --git a/src/test/java/org/tests/compositekeys/TestOnCascadeDeleteChildrenWithCompositeKeys.java b/src/test/java/org/tests/compositekeys/TestOnCascadeDeleteChildrenWithCompositeKeys.java index 08cde0802..095313e33 100644 --- a/src/test/java/org/tests/compositekeys/TestOnCascadeDeleteChildrenWithCompositeKeys.java +++ b/src/test/java/org/tests/compositekeys/TestOnCascadeDeleteChildrenWithCompositeKeys.java @@ -85,8 +85,8 @@ public class TestOnCascadeDeleteChildrenWithCompositeKeys extends BaseTestCase { ids.add(1L); ids.add(2L); - beanProperty.findIdsByParentId(null, ids, null, null); - beanProperty.findIdsByParentId(1L, null, null, null); + beanProperty.findIdsByParentId(null, ids, null, null, true); + beanProperty.findIdsByParentId(1L, null, null, null, true); } @Entity