From 66261e98b5d816d25018f4d741d3cd01dff8862c Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Sun, 11 Dec 2016 19:22:12 +0800 Subject: [PATCH] --- src/org/redkale/source/DataDefaultSource.java | 18 +++++++++--------- src/org/redkale/source/FilterJoinNode.java | 12 +++++++----- src/org/redkale/source/FilterNode.java | 4 ++-- test/org/redkale/source/FilterNodeTest.java | 4 ++-- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/org/redkale/source/DataDefaultSource.java b/src/org/redkale/source/DataDefaultSource.java index 0172a97b9..66e714aab 100644 --- a/src/org/redkale/source/DataDefaultSource.java +++ b/src/org/redkale/source/DataDefaultSource.java @@ -562,7 +562,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node.getJoinTabalis(); - CharSequence join = node.createSQLJoin(this, joinTabalis, info); + CharSequence join = node.createSQLJoin(this, 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)); if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " delete sql=" + sql); @@ -755,7 +755,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node.getJoinTabalis(); - CharSequence join = node.createSQLJoin(this, joinTabalis, info); + CharSequence join = node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); CharSequence where = node.createSQLExpress(info, joinTabalis); String sql = "UPDATE " + info.getTable(node) + " a SET " + info.getSQLColumn("a", column) + " = " @@ -909,7 +909,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node.getJoinTabalis(); - CharSequence join = node.createSQLJoin(this, joinTabalis, info); + CharSequence join = node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); CharSequence where = node.createSQLExpress(info, joinTabalis); String sql = "UPDATE " + info.getTable(node) + " a SET " + setsql + (join == null ? "" : join) @@ -1034,7 +1034,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node.getJoinTabalis(); - CharSequence join = node.createSQLJoin(this, joinTabalis, info); + CharSequence join = node.createSQLJoin(this, joinTabalis, new HashSet<>(), info); CharSequence where = node.createSQLExpress(info, joinTabalis); String sql = "UPDATE " + info.getTable(node) + " a SET " + setsql @@ -1119,7 +1119,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node == null ? null : node.getJoinTabalis(); - final CharSequence join = node == null ? null : node.createSQLJoin(this, joinTabalis, info); + final CharSequence join = node == null ? null : node.createSQLJoin(this, 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 +1166,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node == null ? null : node.getJoinTabalis(); - final CharSequence join = node == null ? null : node.createSQLJoin(this, joinTabalis, info); + final CharSequence join = node == null ? null : node.createSQLJoin(this, 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 +1265,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node == null ? null : node.getJoinTabalis(); - final CharSequence join = node == null ? null : node.createSQLJoin(this, joinTabalis, info); + final CharSequence join = node == null ? null : node.createSQLJoin(this, 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 +1328,7 @@ public final class DataDefaultSource implements DataSource, Function joinTabalis = node == null ? null : node.getJoinTabalis(); - final CharSequence join = node == null ? null : node.createSQLJoin(this, joinTabalis, info); + final CharSequence join = node == null ? null : node.createSQLJoin(this, 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 +1561,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, info); + final CharSequence join = node == null ? null : node.createSQLJoin(this, 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); diff --git a/src/org/redkale/source/FilterJoinNode.java b/src/org/redkale/source/FilterJoinNode.java index c8d36bc4c..fa009a5c6 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 EntityInfo info) { + protected CharSequence createSQLJoin(final Function func, 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,8 @@ public class FilterJoinNode extends FilterNode { } StringBuilder sb = new StringBuilder(); if (this.joinClass != null) { - sb.append(createElementSQLJoin(joinTabalis, info, this)); + CharSequence cs = createElementSQLJoin(joinTabalis, haset, info, this); + if (cs != null) sb.append(cs); } if (morejoin) { Set set = new HashSet<>(); @@ -270,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, info, joinNode); + CharSequence cs = createElementSQLJoin(joinTabalis, haset, info, joinNode); if (cs != null) { sb.append(cs); set.add(joinNode.joinClass); @@ -282,8 +283,8 @@ public class FilterJoinNode extends FilterNode { return sb; } - private static CharSequence createElementSQLJoin(final Map joinTabalis, final EntityInfo info, final FilterJoinNode node) { - if (node.joinClass == null) return null; + private static CharSequence createElementSQLJoin(final Map joinTabalis, final Set haset, final EntityInfo info, final FilterJoinNode node) { + if (node.joinClass == null || haset.contains(joinTabalis.get(node.joinClass))) return null; StringBuilder sb = new StringBuilder(); String[] joinColumns = node.joinColumns; int pos = joinColumns[0].indexOf('='); @@ -293,6 +294,7 @@ public class FilterJoinNode extends FilterNode { 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 2bee3e2e2..b98e90184 100644 --- a/src/org/redkale/source/FilterNode.java +++ b/src/org/redkale/source/FilterNode.java @@ -178,11 +178,11 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 * * @return SQL的join语句 不存在返回null */ - protected CharSequence createSQLJoin(final Function func, final Map joinTabalis, final EntityInfo info) { + protected CharSequence createSQLJoin(final Function func, 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, info); + CharSequence cs = node.createSQLJoin(func, 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 d8435ce9e..e7cd61201 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, carEntity); - CharSequence beanJoinsql = beanNode.createSQLJoin(func, beanJoinTabalis, carEntity); + CharSequence nodeJoinsql = node.createSQLJoin(func, nodeJoinTabalis, new HashSet<>(), carEntity); + CharSequence beanJoinsql = beanNode.createSQLJoin(func, 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);