From dbe473d5a15a80f0d1049ee33eefb5d957fdcd4d Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Thu, 30 Apr 2020 21:33:02 +1200 Subject: [PATCH] #1996 - Fix for MySQLSyntaxErrorException when update in bulk using idIn(). --- .../server/deploy/id/IdBinderSimple.java | 7 ------- .../server/expression/IdInExpression.java | 14 ++++++++------ src/test/java/io/ebean/UpdateQueryTest.java | 4 ++-- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java index 9ae9e1e88..6d4c9ca48 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java +++ b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java @@ -36,7 +36,6 @@ public final class IdBinderSimple implements IdBinder { @SuppressWarnings("rawtypes") private final ScalarType scalarType; - public IdBinderSimple(BeanProperty idProperty, MultiValueBind multiValueBind) { this.idProperty = idProperty; this.scalarType = idProperty.getScalarType(); @@ -71,7 +70,6 @@ public final class IdBinderSimple implements IdBinder { @Override public void buildRawSqlSelectChain(String prefix, List selectChain) { - idProperty.buildRawSqlSelectChain(prefix, selectChain); } @@ -218,7 +216,6 @@ public final class IdBinderSimple implements IdBinder { @Override public String getAssocOneIdExpr(String prefix, String operator) { - StringBuilder sb = new StringBuilder(); if (prefix != null) { sb.append(prefix); @@ -231,7 +228,6 @@ public final class IdBinderSimple implements IdBinder { @Override public String getAssocIdInExpr(String prefix) { - StringBuilder sb = new StringBuilder(); if (prefix != null) { sb.append(prefix); @@ -243,7 +239,6 @@ public final class IdBinderSimple implements IdBinder { @Override public Object convertId(Object idValue) { - if (!idValue.getClass().equals(expectedType)) { return scalarType.toBeanType(idValue); } @@ -252,12 +247,10 @@ public final class IdBinderSimple implements IdBinder { @Override public Object convertSetId(Object idValue, EntityBean bean) { - if (!idValue.getClass().equals(expectedType)) { idValue = scalarType.toBeanType(idValue); } if (bean != null) { - // support PropertyChangeSupport idProperty.setValueIntercept(bean, idValue); } return idValue; diff --git a/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java b/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java index 51b055820..4c08b24d2 100644 --- a/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java @@ -104,16 +104,18 @@ public class IdInExpression extends NonPrepareExpression { @Override public void addSql(SpiExpressionRequest request) { - - DefaultExpressionRequest r = (DefaultExpressionRequest) request; - BeanDescriptor descriptor = r.getBeanDescriptor(); + BeanDescriptor descriptor = request.getBeanDescriptor(); IdBinder idBinder = descriptor.getIdBinder(); if (idCollection.isEmpty()) { request.append(SQL_FALSE); // append false for this stage } else { - request.append(descriptor.getIdBinderInLHSSql()); - String inClause = idBinder.getIdInValueExpr(false, idCollection.size()); - request.append(inClause); + if (idBinder.isComplexId()) { + request.append(descriptor.getIdBinderInLHSSql()); + request.append(idBinder.getIdInValueExpr(false, idCollection.size())); + } else { + request.append(idBinder.getBeanProperty().getName()); + request.appendInExpression(false, idCollection); + } } } diff --git a/src/test/java/io/ebean/UpdateQueryTest.java b/src/test/java/io/ebean/UpdateQueryTest.java index 16634359c..37cd6f2d6 100644 --- a/src/test/java/io/ebean/UpdateQueryTest.java +++ b/src/test/java/io/ebean/UpdateQueryTest.java @@ -106,7 +106,7 @@ public class UpdateQueryTest extends BaseTestCase { int rows = server().find(Customer.class) .where() - .in("id", 1000, 1001, 1002) + .idIn(1000, 1001, 1002) .asUpdate() .setRaw("status = ?", "A") .setLabel("asUpdateByIds") @@ -116,7 +116,7 @@ public class UpdateQueryTest extends BaseTestCase { assertThat(sql).hasSize(1); assertThat(rows).isEqualTo(0); - assertSql(sql.get(0)).contains("update o_customer set status = ? where id in (?,?,?)"); + assertSql(sql.get(0)).contains("update o_customer set status = ? where id in (?,?,?,?,?)"); // bind padding to 5 } @Test