diff --git a/src/org/redkale/source/DataDefaultSource.java b/src/org/redkale/source/DataDefaultSource.java index 66e714aab..ffc288902 100644 --- a/src/org/redkale/source/DataDefaultSource.java +++ b/src/org/redkale/source/DataDefaultSource.java @@ -562,9 +562,19 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node.getJoinTabalis(); - CharSequence join = node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); + CharSequence join = node.createSQLJoin(this, true, joinTabalis, new HashSet<>(), info); CharSequence where = node.createSQLExpress(info, joinTabalis); - String sql = "DELETE " + (this.readPool.isMysql() ? "a" : "") + " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)); + + StringBuilder join1 = null; + StringBuilder join2 = null; + if (join != null) { + String joinstr = join.toString(); + join1 = multisplit('[', ']', ",", new StringBuilder(), joinstr, 0); + join2 = multisplit('{', '}', " AND ", new StringBuilder(), joinstr, 0); + } + String sql = "DELETE " + (this.readPool.isMysql() ? "a" : "") + " FROM " + info.getTable(node) + " a" + (join1 == null ? "" : (", " + join1)) + + ((where == null || where.length() == 0) ? (join2 == null ? "" : (" WHERE " + join2)) + : (" WHERE " + where + (join2 == null ? "" : (" AND " + join2)))); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " delete sql=" + sql); final Statement stmt = conn.createStatement(); c = stmt.executeUpdate(sql); @@ -755,11 +765,20 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node.getJoinTabalis(); - CharSequence join = node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); + CharSequence join = node.createSQLJoin(this, true, joinTabalis, new HashSet<>(), info); CharSequence where = node.createSQLExpress(info, joinTabalis); - String sql = "UPDATE " + info.getTable(node) + " a SET " + info.getSQLColumn("a", column) + " = " - + info.formatToString(value) + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)); + StringBuilder join1 = null; + StringBuilder join2 = null; + if (join != null) { + String joinstr = join.toString(); + join1 = multisplit('[', ']', ",", new StringBuilder(), joinstr, 0); + join2 = multisplit('{', '}', " AND ", new StringBuilder(), joinstr, 0); + } + String sql = "UPDATE " + info.getTable(node) + " a " + (join1 == null ? "" : (", " + join1)) + + " SET " + info.getSQLColumn("a", column) + " = " + info.formatToString(value) + + ((where == null || where.length() == 0) ? (join2 == null ? "" : (" WHERE " + join2)) + : (" WHERE " + where + (join2 == null ? "" : (" AND " + join2)))); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); final Statement stmt = conn.createStatement(); c = stmt.executeUpdate(sql); @@ -909,12 +928,20 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node.getJoinTabalis(); - CharSequence join = node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); + CharSequence join = node.createSQLJoin(this, true, joinTabalis, new HashSet<>(), info); CharSequence where = node.createSQLExpress(info, joinTabalis); - - String sql = "UPDATE " + info.getTable(node) + " a SET " + setsql + (join == null ? "" : join) - + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)) + info.createSQLOrderby(flipper) - + (flipper == null ? "" : (" LIMIT " + flipper.getLimit())); //注:仅支持MySQL + StringBuilder join1 = null; + StringBuilder join2 = null; + if (join != null) { + String joinstr = join.toString(); + join1 = multisplit('[', ']', ",", new StringBuilder(), joinstr, 0); + join2 = multisplit('{', '}', " AND ", new StringBuilder(), joinstr, 0); + } + String sql = "UPDATE " + info.getTable(node) + " a " + (join1 == null ? "" : (", " + join1)) + " SET " + setsql + + ((where == null || where.length() == 0) ? (join2 == null ? "" : (" WHERE " + join2)) + : (" WHERE " + where + (join2 == null ? "" : (" AND " + join2)))); + //注:LIMIT 仅支持MySQL 且在多表关联式会异常, 该BUG尚未解决 + sql += info.createSQLOrderby(flipper) + (flipper == null ? "" : (" LIMIT " + flipper.getLimit())); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); final Statement stmt = conn.createStatement(); c = stmt.executeUpdate(sql); @@ -1034,11 +1061,18 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node.getJoinTabalis(); - CharSequence join = node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); + CharSequence join = node.createSQLJoin(this, true, joinTabalis, new HashSet<>(), info); CharSequence where = node.createSQLExpress(info, joinTabalis); - - String sql = "UPDATE " + info.getTable(node) + " a SET " + setsql - + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)); + StringBuilder join1 = null; + StringBuilder join2 = null; + if (join != null) { + String joinstr = join.toString(); + join1 = multisplit('[', ']', ",", new StringBuilder(), joinstr, 0); + join2 = multisplit('{', '}', " AND ", new StringBuilder(), joinstr, 0); + } + String sql = "UPDATE " + info.getTable(node) + " a " + (join1 == null ? "" : (", " + join1)) + " SET " + setsql + + ((where == null || where.length() == 0) ? (join2 == null ? "" : (" WHERE " + join2)) + : (" WHERE " + where + (join2 == null ? "" : (" AND " + join2)))); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); final Statement stmt = conn.createStatement(); c = stmt.executeUpdate(sql); @@ -1119,7 +1153,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node == null ? null : node.getJoinTabalis(); - final CharSequence join = node == null ? null : node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); + final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, new HashSet<>(), info); final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis); final String sql = "SELECT " + func.getColumn((column == null || column.isEmpty() ? "*" : ("a." + column))) + " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)); @@ -1166,7 +1200,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node == null ? null : node.getJoinTabalis(); - final CharSequence join = node == null ? null : node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); + final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, new HashSet<>(), info); final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis); final String sql = "SELECT a." + sqlkey + ", " + func.getColumn((funcColumn == null || funcColumn.isEmpty() ? "*" : ("a." + funcColumn))) + " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)) + " GROUP BY a." + sqlkey; @@ -1265,7 +1299,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node == null ? null : node.getJoinTabalis(); - final CharSequence join = node == null ? null : node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); + final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, new HashSet<>(), info); final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis); final String sql = "SELECT a.* FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(clazz.getSimpleName() + " find sql=" + sql); @@ -1328,7 +1362,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node == null ? null : node.getJoinTabalis(); - final CharSequence join = node == null ? null : node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); + final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, new HashSet<>(), info); final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis); final String sql = "SELECT COUNT(" + info.getPrimarySQLColumn("a") + ") FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(clazz.getSimpleName() + " exists sql=" + sql); @@ -1561,7 +1595,7 @@ public final class DataDefaultSource implements DataSource, Function list = new ArrayList(); final Map joinTabalis = node == null ? null : node.getJoinTabalis(); - final CharSequence join = node == null ? null : node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); + final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, new HashSet<>(), info); final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis); final String sql = "SELECT a.* FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)) + info.createSQLOrderby(flipper); @@ -1595,6 +1629,17 @@ public final class DataDefaultSource implements DataSource, Function 0) sb.append(split); + sb.append(str.substring(pos1 + 1, pos2)); + return multisplit(ch1, ch2, split, sb, str, pos2 + 1); + } + @Override public final int[] directExecute(String... sqls) { Connection conn = createWriteSQLConnection(); diff --git a/src/org/redkale/source/FilterJoinNode.java b/src/org/redkale/source/FilterJoinNode.java index 33e3823c1..71c63f3d9 100644 --- a/src/org/redkale/source/FilterJoinNode.java +++ b/src/org/redkale/source/FilterJoinNode.java @@ -243,7 +243,7 @@ public class FilterJoinNode extends FilterNode { } @Override - protected CharSequence createSQLJoin(final Function func, final Map joinTabalis, final Set haset, final EntityInfo info) { + protected CharSequence createSQLJoin(final Function func, final boolean update, final Map joinTabalis, final Set haset, final EntityInfo info) { boolean morejoin = false; if (this.joinEntity == null) { if (this.joinClass != null) this.joinEntity = func.apply(this.joinClass); @@ -261,7 +261,7 @@ public class FilterJoinNode extends FilterNode { } StringBuilder sb = new StringBuilder(); if (this.joinClass != null) { - CharSequence cs = createElementSQLJoin(joinTabalis, haset, info, this); + CharSequence cs = createElementSQLJoin(update, joinTabalis, haset, info, this); if (cs != null) sb.append(cs); } if (morejoin) { @@ -271,7 +271,7 @@ public class FilterJoinNode extends FilterNode { if (node instanceof FilterJoinNode) { FilterJoinNode joinNode = ((FilterJoinNode) node); if (!set.contains(joinNode.joinClass)) { - CharSequence cs = createElementSQLJoin(joinTabalis, haset, info, joinNode); + CharSequence cs = createElementSQLJoin(update, joinTabalis, haset, info, joinNode); if (cs != null) { sb.append(cs); set.add(joinNode.joinClass); @@ -283,16 +283,26 @@ public class FilterJoinNode extends FilterNode { return sb; } - private static CharSequence createElementSQLJoin(final Map joinTabalis, final Set haset, final EntityInfo info, final FilterJoinNode node) { + private static CharSequence createElementSQLJoin(final boolean update, final Map joinTabalis, final Set haset, final EntityInfo info, final FilterJoinNode node) { if (node.joinClass == null || (haset != null && haset.contains(joinTabalis.get(node.joinClass)))) return null; StringBuilder sb = new StringBuilder(); String[] joinColumns = node.joinColumns; int pos = joinColumns[0].indexOf('='); - sb.append(" INNER JOIN ").append(node.joinEntity.getTable(node)).append(" ").append(joinTabalis.get(node.joinClass)) - .append(" ON ").append(info.getSQLColumn("a", pos > 0 ? joinColumns[0].substring(0, pos) : joinColumns[0])).append(" = ").append(node.joinEntity.getSQLColumn(joinTabalis.get(node.joinClass), pos > 0 ? joinColumns[0].substring(pos + 1) : joinColumns[0])); - for (int i = 1; i < joinColumns.length; i++) { - pos = joinColumns[i].indexOf('='); - sb.append(" AND ").append(info.getSQLColumn("a", pos > 0 ? joinColumns[i].substring(0, pos) : joinColumns[i])).append(" = ").append(node.joinEntity.getSQLColumn(joinTabalis.get(node.joinClass), pos > 0 ? joinColumns[i].substring(pos + 1) : joinColumns[i])); + if (update) { + sb.append("[").append(node.joinEntity.getTable(node)).append(" ").append(joinTabalis.get(node.joinClass)).append(']'); + sb.append('{').append(info.getSQLColumn("a", pos > 0 ? joinColumns[0].substring(0, pos) : joinColumns[0])).append(" = ").append(node.joinEntity.getSQLColumn(joinTabalis.get(node.joinClass), pos > 0 ? joinColumns[0].substring(pos + 1) : joinColumns[0])); + for (int i = 1; i < joinColumns.length; i++) { + pos = joinColumns[i].indexOf('='); + sb.append(" AND ").append(info.getSQLColumn("a", pos > 0 ? joinColumns[i].substring(0, pos) : joinColumns[i])).append(" = ").append(node.joinEntity.getSQLColumn(joinTabalis.get(node.joinClass), pos > 0 ? joinColumns[i].substring(pos + 1) : joinColumns[i])); + } + sb.append('}'); + } else { + sb.append(" INNER JOIN ").append(node.joinEntity.getTable(node)).append(" ").append(joinTabalis.get(node.joinClass)) + .append(" ON ").append(info.getSQLColumn("a", pos > 0 ? joinColumns[0].substring(0, pos) : joinColumns[0])).append(" = ").append(node.joinEntity.getSQLColumn(joinTabalis.get(node.joinClass), pos > 0 ? joinColumns[0].substring(pos + 1) : joinColumns[0])); + for (int i = 1; i < joinColumns.length; i++) { + pos = joinColumns[i].indexOf('='); + sb.append(" AND ").append(info.getSQLColumn("a", pos > 0 ? joinColumns[i].substring(0, pos) : joinColumns[i])).append(" = ").append(node.joinEntity.getSQLColumn(joinTabalis.get(node.joinClass), pos > 0 ? joinColumns[i].substring(pos + 1) : joinColumns[i])); + } } if (haset != null) haset.add(joinTabalis.get(node.joinClass)); return sb; diff --git a/src/org/redkale/source/FilterNode.java b/src/org/redkale/source/FilterNode.java index b98e90184..3e2b96491 100644 --- a/src/org/redkale/source/FilterNode.java +++ b/src/org/redkale/source/FilterNode.java @@ -173,16 +173,17 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 * * @param Entity类的泛型 * @param func EntityInfo的加载器 + * @param update 是否用于更新的JOIN * @param joinTabalis 关联表集合 * @param info Entity类的EntityInfo * * @return SQL的join语句 不存在返回null */ - protected CharSequence createSQLJoin(final Function func, final Map joinTabalis, final Set haset, final EntityInfo info) { + protected CharSequence createSQLJoin(final Function func, final boolean update, final Map joinTabalis, final Set haset, final EntityInfo info) { if (joinTabalis == null || this.nodes == null) return null; StringBuilder sb = null; for (FilterNode node : this.nodes) { - CharSequence cs = node.createSQLJoin(func, joinTabalis, haset, info); + CharSequence cs = node.createSQLJoin(func, update, joinTabalis, haset, info); if (cs == null) continue; if (sb == null) sb = new StringBuilder(); sb.append(cs); diff --git a/test/org/redkale/source/FilterNodeTest.java b/test/org/redkale/source/FilterNodeTest.java index e7cd61201..61f681520 100644 --- a/test/org/redkale/source/FilterNodeTest.java +++ b/test/org/redkale/source/FilterNodeTest.java @@ -40,8 +40,8 @@ public class FilterNodeTest { System.out.println("bean.string = " + beanNode); Map nodeJoinTabalis = node.getJoinTabalis(); Map beanJoinTabalis = beanNode.getJoinTabalis(); - CharSequence nodeJoinsql = node.createSQLJoin(func, nodeJoinTabalis, new HashSet<>(), carEntity); - CharSequence beanJoinsql = beanNode.createSQLJoin(func, beanJoinTabalis, new HashSet<>(), carEntity); + CharSequence nodeJoinsql = node.createSQLJoin(func, false, nodeJoinTabalis, new HashSet<>(), carEntity); + CharSequence beanJoinsql = beanNode.createSQLJoin(func, false, beanJoinTabalis, new HashSet<>(), carEntity); CharSequence nodeWhere = node.createSQLExpress(carEntity, nodeJoinTabalis); CharSequence beanWhere = beanNode.createSQLExpress(carEntity, beanJoinTabalis); System.out.println("node.sql = SELECT a.* FROM " + CarTestTable.class.getSimpleName().toLowerCase() + " a" + (nodeJoinsql == null ? "" : nodeJoinsql) + " WHERE " + nodeWhere);