From 8758b1f0bf0e6faf32af18bc45cafd5d8eb8c605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Sun, 21 Sep 2014 21:11:54 +0300 Subject: [PATCH 1/2] Fix SQLMergeClause keys handling --- .../mysema/query/sql/dml/SQLMergeClause.java | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLMergeClause.java b/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLMergeClause.java index 86edfa185..9e7baf330 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLMergeClause.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLMergeClause.java @@ -19,11 +19,8 @@ import java.util.*; import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; -import com.mysema.query.DefaultQueryMetadata; -import com.mysema.query.JoinType; -import com.mysema.query.QueryFlag; +import com.mysema.query.*; import com.mysema.query.QueryFlag.Position; -import com.mysema.query.QueryMetadata; import com.mysema.query.dml.StoreClause; import com.mysema.query.sql.*; import com.mysema.query.sql.types.Null; @@ -32,6 +29,7 @@ import com.mysema.util.ResultSetAdapter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** /** * SQLMergeClause defines an MERGE INTO clause * @@ -248,12 +246,11 @@ public class SQLMergeClause extends AbstractSQLClause implements } }; } else { - List ids = getIds(); - if (!ids.isEmpty()) { + if (hasRow()) { // update SQLUpdateClause update = new SQLUpdateClause(connection, configuration.getTemplates(), entity); populate(update); - update.where(ExpressionUtils.in((Expression)getKeys().get(0),ids)); + addKeyConditions(update); return EmptyResultSet.DEFAULT; } else { // insert @@ -296,27 +293,32 @@ public class SQLMergeClause extends AbstractSQLClause implements } } - private List getIds() { - // select + private boolean hasRow() { SQLQuery query = new SQLQuery(connection, configuration.getTemplates()).from(entity); + addKeyConditions(query); + return query.exists(); + } + + private void addKeyConditions(FilteredClause query) { + List> keys = getKeys(); for (int i=0; i < columns.size(); i++) { - if (values.get(i) instanceof NullExpression) { - query.where(ExpressionUtils.isNull(columns.get(i))); - } else { - query.where(ExpressionUtils.eq(columns.get(i),(Expression)values.get(i))); + if (keys.contains(columns.get(i))) { + if (values.get(i) instanceof NullExpression) { + query.where(ExpressionUtils.isNull(columns.get(i))); + } else { + query.where(ExpressionUtils.eq(columns.get(i),(Expression)values.get(i))); + } } } - return query.list(getKeys().get(0)); } @SuppressWarnings("unchecked") private long executeCompositeMerge() { - List ids = getIds(); - if (!ids.isEmpty()) { + if (hasRow()) { // update SQLUpdateClause update = new SQLUpdateClause(connection, configuration.getTemplates(), entity); populate(update); - update.where(ExpressionUtils.in((Expression)getKeys().get(0),ids)); + addKeyConditions(update); return update.execute(); } else { // insert From 0e03d303b05878e09b17d726d349fb59030a7c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 30 Sep 2014 18:57:46 +0300 Subject: [PATCH 2/2] Use configuration directly --- .../java/com/mysema/query/sql/dml/SQLMergeClause.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLMergeClause.java b/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLMergeClause.java index 9e7baf330..f7ad85ef0 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLMergeClause.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLMergeClause.java @@ -248,13 +248,13 @@ public class SQLMergeClause extends AbstractSQLClause implements } else { if (hasRow()) { // update - SQLUpdateClause update = new SQLUpdateClause(connection, configuration.getTemplates(), entity); + SQLUpdateClause update = new SQLUpdateClause(connection, configuration, entity); populate(update); addKeyConditions(update); return EmptyResultSet.DEFAULT; } else { // insert - SQLInsertClause insert = new SQLInsertClause(connection, configuration.getTemplates(), entity); + SQLInsertClause insert = new SQLInsertClause(connection, configuration, entity); populate(insert); return insert.executeWithKeys(); } @@ -294,7 +294,7 @@ public class SQLMergeClause extends AbstractSQLClause implements } private boolean hasRow() { - SQLQuery query = new SQLQuery(connection, configuration.getTemplates()).from(entity); + SQLQuery query = new SQLQuery(connection, configuration).from(entity); addKeyConditions(query); return query.exists(); } @@ -316,13 +316,13 @@ public class SQLMergeClause extends AbstractSQLClause implements private long executeCompositeMerge() { if (hasRow()) { // update - SQLUpdateClause update = new SQLUpdateClause(connection, configuration.getTemplates(), entity); + SQLUpdateClause update = new SQLUpdateClause(connection, configuration, entity); populate(update); addKeyConditions(update); return update.execute(); } else { // insert - SQLInsertClause insert = new SQLInsertClause(connection, configuration.getTemplates(), entity); + SQLInsertClause insert = new SQLInsertClause(connection, configuration, entity); populate(insert); return insert.execute();