|
@@ -38,9 +38,11 @@ import org.hswebframework.ezorm.rdb.render.dialect.*;
|
|
|
import org.hswebframework.ezorm.rdb.render.support.simple.CommonSqlRender;
|
|
|
import org.hswebframework.ezorm.rdb.render.support.simple.SimpleWhereSqlBuilder;
|
|
|
import org.hswebframework.web.BusinessException;
|
|
|
+import org.hswebframework.web.bean.FastBeanCopier;
|
|
|
import org.hswebframework.web.commons.entity.Entity;
|
|
|
import org.hswebframework.web.commons.entity.factory.EntityFactory;
|
|
|
import org.hswebframework.web.dao.mybatis.builder.jpa.JpaAnnotationParser;
|
|
|
+import org.hswebframework.web.dao.mybatis.handler.NumberBooleanTypeHandler;
|
|
|
import org.hswebframework.web.dao.mybatis.plgins.pager.Pager;
|
|
|
import org.hswebframework.web.dao.mybatis.MybatisUtils;
|
|
|
import org.hswebframework.utils.StringUtils;
|
|
@@ -106,11 +108,11 @@ public class EasyOrmSqlBuilder {
|
|
|
return javaType;
|
|
|
}
|
|
|
|
|
|
- private final RDBDatabaseMetaData mysql = new MysqlMeta();
|
|
|
- private final RDBDatabaseMetaData oracle = new OracleMeta();
|
|
|
- private final RDBDatabaseMetaData h2 = new H2Meta();
|
|
|
- private final RDBDatabaseMetaData postgresql = new PGMeta();
|
|
|
- private final RDBDatabaseMetaData mssql = new MSSQLMeta();
|
|
|
+ public static final RDBDatabaseMetaData mysql = new MysqlMeta();
|
|
|
+ public static final RDBDatabaseMetaData oracle = new OracleMeta();
|
|
|
+ public static final RDBDatabaseMetaData h2 = new H2Meta();
|
|
|
+ public static final RDBDatabaseMetaData postgresql = new PGMeta();
|
|
|
+ public static final RDBDatabaseMetaData mssql = new MSSQLMeta();
|
|
|
|
|
|
private final ConcurrentMap<RDBDatabaseMetaData, Map<String, RDBTableMetaData>> metaCache = new ConcurrentHashMap<>();
|
|
|
|
|
@@ -145,6 +147,50 @@ public class EasyOrmSqlBuilder {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ private List<RDBColumnMetaData> createColumn(String prefix, String columnName, ResultMapping resultMapping) {
|
|
|
+ List<RDBColumnMetaData> metaData = new ArrayList<>();
|
|
|
+ if (resultMapping.getNestedQueryId() == null) {
|
|
|
+
|
|
|
+ if (resultMapping.getNestedResultMapId() != null) {
|
|
|
+ ResultMap nests = MybatisUtils.getResultMap(resultMapping.getNestedResultMapId());
|
|
|
+ Set<ResultMapping> resultMappings = new HashSet<>(nests.getResultMappings());
|
|
|
+ resultMappings.addAll(nests.getIdResultMappings());
|
|
|
+ for (ResultMapping mapping : resultMappings) {
|
|
|
+ metaData.addAll(createColumn(resultMapping.getProperty(),
|
|
|
+ org.springframework.util.StringUtils.hasText(resultMapping.getColumn())
|
|
|
+ ? resultMapping.getColumn()
|
|
|
+ : resultMapping.getProperty(),
|
|
|
+ mapping));
|
|
|
+ }
|
|
|
+ return metaData;
|
|
|
+ }
|
|
|
+
|
|
|
+ JDBCType jdbcType = JDBCType.VARCHAR;
|
|
|
+ try {
|
|
|
+ jdbcType = JDBCType.valueOf(resultMapping.getJdbcType().name());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("can not parse jdbcType:{}", resultMapping.getJdbcType());
|
|
|
+ }
|
|
|
+ RDBColumnMetaData column = new RDBColumnMetaData();
|
|
|
+ column.setJdbcType(jdbcType);
|
|
|
+ column.setName(org.springframework.util.StringUtils.hasText(columnName)
|
|
|
+ ? columnName.concat(".").concat(resultMapping.getColumn()) : resultMapping.getColumn());
|
|
|
+
|
|
|
+ if (resultMapping.getTypeHandler() != null) {
|
|
|
+ column.setProperty("typeHandler", resultMapping.getTypeHandler().getClass().getName());
|
|
|
+ }
|
|
|
+ if (!StringUtils.isNullOrEmpty(resultMapping.getProperty())) {
|
|
|
+ column.setAlias(org.springframework.util.StringUtils.hasText(prefix)
|
|
|
+ ? prefix.concat(".").concat(resultMapping.getProperty()) : resultMapping.getProperty());
|
|
|
+
|
|
|
+ }
|
|
|
+ column.setJavaType(resultMapping.getJavaType());
|
|
|
+ column.setProperty("resultMapping", resultMapping);
|
|
|
+ metaData.add(column);
|
|
|
+ }
|
|
|
+ return metaData;
|
|
|
+ }
|
|
|
+
|
|
|
protected RDBTableMetaData createMeta(String tableName, String resultMapId) {
|
|
|
// tableName = getRealTableName(tableName);
|
|
|
RDBDatabaseMetaData active = getActiveDatabase();
|
|
@@ -169,40 +215,11 @@ public class EasyOrmSqlBuilder {
|
|
|
|
|
|
List<ResultMapping> resultMappings = new ArrayList<>(resultMaps.getResultMappings());
|
|
|
resultMappings.addAll(resultMaps.getIdResultMappings());
|
|
|
- for (ResultMapping resultMapping : resultMappings) {
|
|
|
- if (resultMapping.getNestedQueryId() == null) {
|
|
|
- RDBColumnMetaData column = new RDBColumnMetaData();
|
|
|
- column.setJdbcType(JDBCType.valueOf(resultMapping.getJdbcType().name()));
|
|
|
- column.setName(resultMapping.getColumn());
|
|
|
- if (resultMapping.getTypeHandler() != null) {
|
|
|
- column.setProperty("typeHandler", resultMapping.getTypeHandler().getClass().getName());
|
|
|
- }
|
|
|
- if (!StringUtils.isNullOrEmpty(resultMapping.getProperty())) {
|
|
|
- column.setAlias(resultMapping.getProperty());
|
|
|
- }
|
|
|
- column.setJavaType(resultMapping.getJavaType());
|
|
|
- column.setProperty("resultMapping", resultMapping);
|
|
|
- //时间
|
|
|
- if (column.getJdbcType() == JDBCType.DATE || column.getJdbcType() == JDBCType.TIMESTAMP) {
|
|
|
- ValueConverter dateConvert = new DateTimeConverter("yyyy-MM-dd HH:mm:ss", column.getJavaType()) {
|
|
|
- @Override
|
|
|
- public Object getData(Object value) {
|
|
|
- if (value instanceof Number) {
|
|
|
- return new Date(((Number) value).longValue());
|
|
|
- }
|
|
|
- return super.getData(value);
|
|
|
- }
|
|
|
- };
|
|
|
- column.setValueConverter(dateConvert);
|
|
|
- } else if (column.getJavaType() == boolean.class || column.getJavaType() == Boolean.class) {
|
|
|
- column.setValueConverter(new BooleanValueConverter(column.getJdbcType()));
|
|
|
- } else if (TypeUtils.isNumberType(column)) { //数字
|
|
|
- //数字
|
|
|
- column.setValueConverter(new NumberValueConverter(column.getJavaType()));
|
|
|
- }
|
|
|
- rdbTableMetaData.addColumn(column);
|
|
|
- }
|
|
|
- }
|
|
|
+
|
|
|
+ resultMappings.stream()
|
|
|
+ .map(mapping -> this.createColumn(null, null, mapping))
|
|
|
+ .flatMap(Collection::stream)
|
|
|
+ .forEach(rdbTableMetaData::addColumn);
|
|
|
|
|
|
if (useJpa) {
|
|
|
Class type = entityFactory == null ? resultMaps.getType() : entityFactory.getInstanceType(resultMaps.getType());
|
|
@@ -217,6 +234,27 @@ public class EasyOrmSqlBuilder {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ for (RDBColumnMetaData column : rdbTableMetaData.getColumns()) {
|
|
|
+ //时间
|
|
|
+ if (column.getJdbcType() == JDBCType.DATE || column.getJdbcType() == JDBCType.TIMESTAMP) {
|
|
|
+ ValueConverter dateConvert = new DateTimeConverter("yyyy-MM-dd HH:mm:ss", column.getJavaType()) {
|
|
|
+ @Override
|
|
|
+ public Object getData(Object value) {
|
|
|
+ if (value instanceof Number) {
|
|
|
+ return new Date(((Number) value).longValue());
|
|
|
+ }
|
|
|
+ return super.getData(value);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ column.setValueConverter(dateConvert);
|
|
|
+ } else if (column.getJavaType() == boolean.class || column.getJavaType() == Boolean.class) {
|
|
|
+ column.setValueConverter(new BooleanValueConverter(column.getJdbcType()));
|
|
|
+ column.setProperty("typeHandler", NumberBooleanTypeHandler.class.getName());
|
|
|
+ } else if (TypeUtils.isNumberType(column)) { //数字
|
|
|
+ //数字
|
|
|
+ column.setValueConverter(new NumberValueConverter(column.getJavaType()));
|
|
|
+ }
|
|
|
+ }
|
|
|
cache.put(cacheKey, rdbTableMetaData);
|
|
|
return rdbTableMetaData;
|
|
|
}
|
|
@@ -230,7 +268,11 @@ public class EasyOrmSqlBuilder {
|
|
|
CommonSqlRender render = (CommonSqlRender) databaseMetaDate.getRenderer(SqlRender.TYPE.SELECT);
|
|
|
List<CommonSqlRender.OperationColumn> columns = render.parseOperationField(tableMetaData, param);
|
|
|
SqlAppender appender = new SqlAppender();
|
|
|
+ Object data = param.getData();
|
|
|
+ Map<String, Object> mapData = FastBeanCopier.copy(data, HashMap::new);
|
|
|
+
|
|
|
columns.forEach(column -> {
|
|
|
+
|
|
|
RDBColumnMetaData columnMetaData = column.getRDBColumnMetaData();
|
|
|
if (columnMetaData == null) {
|
|
|
return;
|
|
@@ -238,21 +280,27 @@ public class EasyOrmSqlBuilder {
|
|
|
if (columnMetaData.getName().contains(".")) {
|
|
|
return;
|
|
|
}
|
|
|
- Object value;
|
|
|
- try {
|
|
|
- value = propertyUtils.getProperty(param.getData(), columnMetaData.getAlias());
|
|
|
- if (value == null) {
|
|
|
- return;
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
+ if (columnMetaData.getProperty("read-only").isTrue()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Object value = mapData.get(columnMetaData.getAlias());
|
|
|
+
|
|
|
+ if (value == null) {
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
if (value instanceof Sql) {
|
|
|
- appender.add(",", encodeColumn(dialect, columnMetaData.getName())
|
|
|
- , "=", ((Sql) value).getSql());
|
|
|
+ appender.add(",", encodeColumn(dialect, columnMetaData.getName()), "=", ((Sql) value).getSql());
|
|
|
} else {
|
|
|
- String typeHandler = columnMetaData.getProperty("typeHandler")
|
|
|
- .getValue();
|
|
|
+ value = columnMetaData.getValueConverter().getData(value);
|
|
|
+
|
|
|
+ if (columnMetaData.getOptionConverter() != null) {
|
|
|
+ value = columnMetaData.getOptionConverter().converterData(value);
|
|
|
+ }
|
|
|
+
|
|
|
+ mapData.put(columnMetaData.getAlias(), value);
|
|
|
+
|
|
|
+ String typeHandler = columnMetaData.getProperty("typeHandler").getValue();
|
|
|
|
|
|
appender.add(",", encodeColumn(dialect, columnMetaData.getName())
|
|
|
, "=", "#{data.", columnMetaData.getAlias(),
|
|
@@ -303,15 +351,18 @@ public class EasyOrmSqlBuilder {
|
|
|
QueryParam param = null;
|
|
|
if (arg instanceof QueryParam) {
|
|
|
param = ((QueryParam) arg);
|
|
|
+ if (param.isPaging()) {
|
|
|
+ if (Pager.get() == null) {
|
|
|
+ Pager.doPaging(param.getPageIndex(), param.getPageSize());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ Pager.reset();
|
|
|
+ }
|
|
|
}
|
|
|
if (param == null) {
|
|
|
return "*";
|
|
|
}
|
|
|
- if (param.isPaging() && Pager.get() == null) {
|
|
|
- Pager.doPaging(param.getPageIndex(), param.getPageSize());
|
|
|
- } else {
|
|
|
- Pager.reset();
|
|
|
- }
|
|
|
+
|
|
|
RDBTableMetaData tableMetaData = createMeta(tableName, resultMapId);
|
|
|
RDBDatabaseMetaData databaseMetaDate = getActiveDatabase();
|
|
|
Dialect dialect = databaseMetaDate.getDialect();
|
|
@@ -401,6 +452,16 @@ public class EasyOrmSqlBuilder {
|
|
|
} else {
|
|
|
terms = new ArrayList<>();
|
|
|
}
|
|
|
+ if (param instanceof QueryParam) {
|
|
|
+ QueryParam queryParam = ((QueryParam) param);
|
|
|
+ if (queryParam.isPaging()) {
|
|
|
+ if (Pager.get() == null) {
|
|
|
+ Pager.doPaging(queryParam.getPageIndex(), queryParam.getPageSize());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ Pager.reset();
|
|
|
+ }
|
|
|
+ }
|
|
|
return buildWhere(resultMapId, tableName, terms);
|
|
|
}
|
|
|
|
|
@@ -418,7 +479,7 @@ public class EasyOrmSqlBuilder {
|
|
|
return appender.toString();
|
|
|
}
|
|
|
|
|
|
- class MysqlMeta extends MysqlRDBDatabaseMetaData {
|
|
|
+ static class MysqlMeta extends MysqlRDBDatabaseMetaData {
|
|
|
MysqlMeta() {
|
|
|
super();
|
|
|
renderMap.put(SqlRender.TYPE.INSERT, new InsertSqlBuilder());
|
|
@@ -431,7 +492,7 @@ public class EasyOrmSqlBuilder {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- class OracleMeta extends OracleRDBDatabaseMetaData {
|
|
|
+ static class OracleMeta extends OracleRDBDatabaseMetaData {
|
|
|
OracleMeta() {
|
|
|
super();
|
|
|
renderMap.put(SqlRender.TYPE.INSERT, new InsertSqlBuilder());
|
|
@@ -444,7 +505,7 @@ public class EasyOrmSqlBuilder {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- class H2Meta extends H2RDBDatabaseMetaData {
|
|
|
+ static class H2Meta extends H2RDBDatabaseMetaData {
|
|
|
H2Meta() {
|
|
|
super();
|
|
|
renderMap.put(SqlRender.TYPE.INSERT, new InsertSqlBuilder());
|
|
@@ -457,7 +518,7 @@ public class EasyOrmSqlBuilder {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- class PGMeta extends PGRDBDatabaseMetaData {
|
|
|
+ static class PGMeta extends PGRDBDatabaseMetaData {
|
|
|
PGMeta() {
|
|
|
super();
|
|
|
renderMap.put(SqlRender.TYPE.INSERT, new InsertSqlBuilder());
|
|
@@ -470,7 +531,7 @@ public class EasyOrmSqlBuilder {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- class MSSQLMeta extends MSSQLRDBDatabaseMetaData {
|
|
|
+ static class MSSQLMeta extends MSSQLRDBDatabaseMetaData {
|
|
|
MSSQLMeta() {
|
|
|
super();
|
|
|
renderMap.put(SqlRender.TYPE.INSERT, new InsertSqlBuilder());
|