diff --git a/src/com/wentch/redkale/source/DataDefaultSource.java b/src/com/wentch/redkale/source/DataDefaultSource.java index 4ca4a502e..c008c22a3 100644 --- a/src/com/wentch/redkale/source/DataDefaultSource.java +++ b/src/com/wentch/redkale/source/DataDefaultSource.java @@ -646,8 +646,8 @@ public final class DataDefaultSource implements DataSource, Nameable, Function { if (updatesb.length() > 0) updatesb.append(','); updatesb.append(col).append(" = ?"); } - this.updateSQL = "UPDATE " + table + " SET " + updatesb + " WHERE " + getPrimarySQLColumn() + " = ?"; - this.deleteSQL = "DELETE FROM " + table + " WHERE " + getPrimarySQLColumn() + " = ?"; - this.querySQL = "SELECT * FROM " + table + " WHERE " + getPrimarySQLColumn() + " = ?"; + this.updateSQL = "UPDATE " + table + " SET " + updatesb + " WHERE " + getPrimarySQLColumn(null) + " = ?"; + this.deleteSQL = "DELETE FROM " + table + " WHERE " + getPrimarySQLColumn(null) + " = ?"; + this.querySQL = "SELECT * FROM " + table + " WHERE " + getPrimarySQLColumn(null) + " = ?"; } else { this.insertSQL = null; this.updateSQL = null; @@ -305,9 +305,9 @@ public final class EntityInfo { String[] sub = item.split("\\s+"); if (flag) sb.append(','); if (sub.length < 2 || sub[1].equalsIgnoreCase("ASC")) { - sb.append("a.").append(getSQLColumn(sub[0])).append(" ASC"); + sb.append(getSQLColumn("a", sub[0])).append(" ASC"); } else { - sb.append("a.").append(getSQLColumn(sub[0])).append(" DESC"); + sb.append(getSQLColumn("a", sub[0])).append(" DESC"); } flag = true; } @@ -318,13 +318,18 @@ public final class EntityInfo { } //根据field字段名获取数据库对应的字段名 - public String getSQLColumn(String fieldname) { - return this.aliasmap == null ? fieldname : aliasmap.getOrDefault(fieldname, fieldname); + public String getSQLColumn(String tabalis, String fieldname) { + return this.aliasmap == null ? (tabalis == null ? fieldname : (tabalis + '.' + fieldname)) + : (tabalis == null ? aliasmap.getOrDefault(fieldname, fieldname) : (tabalis + '.' + aliasmap.getOrDefault(fieldname, fieldname))); + } + + public String getPrimarySQLColumn() { + return getSQLColumn(null, this.primary.field()); } //数据库字段名 - public String getPrimarySQLColumn() { - return getSQLColumn(this.primary.field()); + public String getPrimarySQLColumn(String tabalis) { + return getSQLColumn(tabalis, this.primary.field()); } public Map> getAttributes() { @@ -339,7 +344,7 @@ public final class EntityInfo { T obj = creator.create(); for (Attribute attr : queryAttributes) { if (sels == null || sels.validate(attr.field())) { - Serializable o = (Serializable) set.getObject(this.getSQLColumn(attr.field())); + Serializable o = (Serializable) set.getObject(this.getSQLColumn(null, attr.field())); if (o != null) { Class t = attr.type(); if (t == short.class) { diff --git a/src/com/wentch/redkale/source/FilterBeanNode.java b/src/com/wentch/redkale/source/FilterBeanNode.java index 81274429a..8f9fc7d3b 100644 --- a/src/com/wentch/redkale/source/FilterBeanNode.java +++ b/src/com/wentch/redkale/source/FilterBeanNode.java @@ -91,8 +91,7 @@ final class FilterBeanNode extends FilterNode { final String jc = joinCol.column().isEmpty() ? secinfo.getPrimary().field() : joinCol.column(); if (first) { joinsb.append(" ").append(joinCol.type().name()).append(" JOIN ").append(secinfo.getTable()) - .append(" ").append(alias).append(" ON a.").append(secinfo.getSQLColumn(jc)).append(" = ") - .append(alias).append(".").append(secinfo.getSQLColumn(jc)); + .append(" ").append(alias).append(" ON ").append(secinfo.getSQLColumn("a", jc)).append(" = ").append(secinfo.getSQLColumn(alias, jc)); } newnode.foreignCache = secinfo.getCache(); newnode.tabalis = alias; @@ -181,9 +180,7 @@ final class FilterBeanNode extends FilterNode { if (type.isArray() || Collection.class.isAssignableFrom(type)) { if (Range.class.isAssignableFrom(type.getComponentType())) { if (AND != exp) exp = OR; - } else { - if (NOTIN != exp) exp = IN; - } + } else if (NOTIN != exp) exp = IN; } else if (Range.class.isAssignableFrom(type)) { if (NOTBETWEEN != exp) exp = BETWEEN; } diff --git a/src/com/wentch/redkale/source/FilterJoinNode.java b/src/com/wentch/redkale/source/FilterJoinNode.java index dee0ad503..1684fcee1 100644 --- a/src/com/wentch/redkale/source/FilterJoinNode.java +++ b/src/com/wentch/redkale/source/FilterJoinNode.java @@ -5,13 +5,73 @@ */ package com.wentch.redkale.source; +import java.io.*; +import java.util.function.*; + /** * * @author zhangjx */ public class FilterJoinNode extends FilterNode { + private String tabalis; + private Class joinClass; private String joinColumn; + + public FilterJoinNode() { + } + + protected FilterJoinNode(Class joinClass, String joinColumn, String column, Serializable value) { + this(joinClass, joinColumn, column, null, value); + } + + protected FilterJoinNode(Class joinClass, String joinColumn, String column, FilterExpress express, Serializable value) { + this.joinClass = joinClass; + this.joinColumn = joinColumn; + this.column = column; + this.express = express; + this.value = value; + } + + public static FilterNode create(Class joinClass, String joinColumn, String column, Serializable value) { + return new FilterJoinNode(joinClass, joinColumn, column, value); + } + + public static FilterNode create(Class joinClass, String joinColumn, String column, FilterExpress express, Serializable value) { + return new FilterJoinNode(joinClass, joinColumn, column, express, value); + } + + @Override + protected CharSequence createSQLExpress(final Function func, final EntityInfo info, final FilterBean bean) { + if (this.joinClass == null) return super.createSQLExpress(func, info, bean); + return super.createSQLExpress(func, func.apply(joinClass), bean); + } + + public Class getJoinClass() { + return joinClass; + } + + public void setJoinClass(Class joinClass) { + this.joinClass = joinClass; + } + + public String getJoinColumn() { + return joinColumn; + } + + public void setJoinColumn(String joinColumn) { + this.joinColumn = joinColumn; + } + + @Override + public String getTabalis() { + return tabalis; + } + + public void setTabalis(String tabalis) { + this.tabalis = tabalis; + } + } diff --git a/src/com/wentch/redkale/source/FilterNode.java b/src/com/wentch/redkale/source/FilterNode.java index deee8189e..33d8ec5b6 100644 --- a/src/com/wentch/redkale/source/FilterNode.java +++ b/src/com/wentch/redkale/source/FilterNode.java @@ -155,15 +155,16 @@ public class FilterNode { return true; } - public static FilterNode create(String column, Serializable value) { - return create(column, null, value); - } - - public static FilterNode create(String column, FilterExpress express, Serializable value) { - return new FilterNode(column, express, value); - } - - protected final CharSequence createSQLExpress(final EntityInfo info, final FilterBean bean) { + /** + * 该方法需要重载 + * + * @param + * @param func + * @param info + * @param bean + * @return + */ + protected CharSequence createSQLExpress(final Function func, final EntityInfo info, final FilterBean bean) { CharSequence sb0 = createElementSQLExpress(info, bean); if (this.nodes == null) return sb0; final StringBuilder rs = new StringBuilder(); @@ -174,7 +175,7 @@ public class FilterNode { rs.append(sb0); } for (FilterNode node : this.nodes) { - CharSequence f = node.createSQLExpress(info, bean); + CharSequence f = node.createSQLExpress(func, info, bean); if (f == null || f.length() < 3) continue; if (more) rs.append(or ? " OR " : " AND "); rs.append(f); @@ -185,23 +186,29 @@ public class FilterNode { return rs; } + public static FilterNode create(String column, Serializable value) { + return create(column, null, value); + } + + public static FilterNode create(String column, FilterExpress express, Serializable value) { + return new FilterNode(column, express, value); + } + protected final CharSequence createElementSQLExpress(final EntityInfo info, final FilterBean bean) { if (column == null) return null; - final String tabalis = getTabalis(); + final String talis = getTabalis() == null ? "a" : getTabalis(); if (express == ISNULL || express == ISNOTNULL) { StringBuilder sb = new StringBuilder(); - if (tabalis != null) sb.append(tabalis).append('.'); - sb.append(info.getSQLColumn(column)).append(' ').append(express.value()); + sb.append(info.getSQLColumn(talis, column)).append(' ').append(express.value()); return sb; } final CharSequence val = formatToString(express, getElementValue(bean)); if (val == null) return null; StringBuilder sb = new StringBuilder(32); - if (tabalis != null) sb.append(tabalis).append('.'); if (express == IGNORECASELIKE || express == IGNORECASENOTLIKE) { - sb.append("LOWER(").append(info.getSQLColumn(column)).append(')'); + sb.append("LOWER(").append(info.getSQLColumn(talis, column)).append(')'); } else { - sb.append(info.getSQLColumn(column)); + sb.append(info.getSQLColumn(talis, column)); } sb.append(' '); switch (express) { @@ -794,7 +801,7 @@ public class FilterNode { return toString(null); } - public String toString(final FilterBean bean) { + protected String toString(final FilterBean bean) { StringBuilder sb = new StringBuilder(); if (nodes == null) { if (column != null) {