From 96a4b93c752eec921396f40b5ae9ed6c67176a35 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Mon, 16 Oct 2017 22:58:48 +1300 Subject: [PATCH] #1167 - BUG: query.setId(...).delete() does not work --- .../server/deploy/BeanDescriptor.java | 8 ++++++-- .../server/expression/IdExpression.java | 2 +- .../server/query/CQueryBuilder.java | 2 +- .../server/query/CQueryBuilderRawSql.java | 2 +- .../java/org/tests/delete/TestDeleteByQuery.java | 16 ++++++++++++++++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 66941c5db..306940797 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -1666,8 +1666,12 @@ public class BeanDescriptor implements MetaBeanInfo, BeanType { * Return the sql for binding an id. This is the columns with table alias that * make up the id. */ - public String getIdBinderIdSql() { - return idBinderIdSql; + public String getIdBinderIdSql(String alias) { + if (alias == null) { + return idBinderIdSql; + } else { + return idBinder.getBindIdSql(alias); + } } /** diff --git a/src/main/java/io/ebeaninternal/server/expression/IdExpression.java b/src/main/java/io/ebeaninternal/server/expression/IdExpression.java index aafc5b360..ad7769ae9 100644 --- a/src/main/java/io/ebeaninternal/server/expression/IdExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/IdExpression.java @@ -58,7 +58,7 @@ class IdExpression extends NonPrepareExpression implements SpiExpression { public void addSql(SpiExpressionRequest request) { DefaultExpressionRequest r = (DefaultExpressionRequest) request; - String idSql = r.getBeanDescriptor().getIdBinderIdSql(); + String idSql = r.getBeanDescriptor().getIdBinderIdSql(null); request.append(idSql).append(" "); } diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java index 26dd7aaca..71c30d744 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java @@ -564,7 +564,7 @@ class CQueryBuilder { appendWhere(hasWhere, sb); BeanDescriptor desc = request.getBeanDescriptor(); - String idSql = desc.getIdBinderIdSql(); + String idSql = desc.getIdBinderIdSql(query.getAlias()); if (idSql.isEmpty()) { throw new IllegalStateException("Executing FindById query on entity bean " + desc.getName() + " that doesn't have an @Id property??"); diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java b/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java index 2a84760b6..9cc90b5ba 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryBuilderRawSql.java @@ -86,7 +86,7 @@ class CQueryBuilderRawSql { BeanDescriptor descriptor = request.getBeanDescriptor(); //FIXME: I think this is broken... needs to be logical // and then parsed for RawSqlSelect... - dynamicWhere = descriptor.getIdBinderIdSql(); + dynamicWhere = descriptor.getIdBinderIdSql(null); } String dbWhere = predicates.getDbWhere(); diff --git a/src/test/java/org/tests/delete/TestDeleteByQuery.java b/src/test/java/org/tests/delete/TestDeleteByQuery.java index f771c8d37..4adeef974 100644 --- a/src/test/java/org/tests/delete/TestDeleteByQuery.java +++ b/src/test/java/org/tests/delete/TestDeleteByQuery.java @@ -51,6 +51,22 @@ public class TestDeleteByQuery extends BaseTestCase { assertThat(list).isEmpty(); } + @Test + public void queryByIdDelete() { + + LoggedSqlCollector.start(); + + Ebean.find(Contact.class).where().eq("id", 7000).delete(); + Ebean.find(Contact.class).setId(7000).delete(); + + List sql = LoggedSqlCollector.stop(); + assertThat(sql.get(0)).contains("delete from contact where id = ?"); + assertThat(sql.get(1)).contains("delete from contact where id = ?"); + + // and note this is the easiest option + Ebean.delete(Contact.class, 7000); + } + @Test public void testWithForUpdate() {