This commit is contained in:
Redkale
2016-12-11 19:22:12 +08:00
parent d9a268d30a
commit 66261e98b5
4 changed files with 20 additions and 18 deletions

View File

@@ -562,7 +562,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
try {
if (!info.isVirtualEntity()) {
Map<Class, String> 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<Class, Enti
int c = -1;
if (!info.isVirtualEntity()) {
Map<Class, String> 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<Class, Enti
int c = -1;
if (!virtual) {
Map<Class, String> 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<Class, Enti
int c = -1;
if (!virtual) {
Map<Class, String> 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<Class, Enti
}
}
final Map<Class, String> 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<Class, Enti
}
final String sqlkey = info.getSQLColumn(null, keyColumn);
final Map<Class, String> 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<Class, Enti
try {
final SelectColumn sels = selects;
final Map<Class, String> 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<Class, Enti
final Connection conn = createReadSQLConnection();
try {
final Map<Class, String> 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<Class, Enti
final SelectColumn sels = selects;
final List<T> list = new ArrayList();
final Map<Class, String> 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);

View File

@@ -243,7 +243,7 @@ public class FilterJoinNode extends FilterNode {
}
@Override
protected <T> CharSequence createSQLJoin(final Function<Class, EntityInfo> func, final Map<Class, String> joinTabalis, final EntityInfo<T> info) {
protected <T> CharSequence createSQLJoin(final Function<Class, EntityInfo> func, final Map<Class, String> joinTabalis, final Set<String> haset, final EntityInfo<T> 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<Class> 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<Class, String> joinTabalis, final EntityInfo info, final FilterJoinNode node) {
if (node.joinClass == null) return null;
private static CharSequence createElementSQLJoin(final Map<Class, String> joinTabalis, final Set<String> 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;
}

View File

@@ -178,11 +178,11 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
*
* @return SQL的join语句 不存在返回null
*/
protected <T> CharSequence createSQLJoin(final Function<Class, EntityInfo> func, final Map<Class, String> joinTabalis, final EntityInfo<T> info) {
protected <T> CharSequence createSQLJoin(final Function<Class, EntityInfo> func, final Map<Class, String> joinTabalis, final Set<String> haset, final EntityInfo<T> 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);

View File

@@ -40,8 +40,8 @@ public class FilterNodeTest {
System.out.println("bean.string = " + beanNode);
Map<Class, String> nodeJoinTabalis = node.getJoinTabalis();
Map<Class, String> 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);