|
|
@@ -1,14 +1,37 @@
|
|
|
package com.kym.jdbc.express;
|
|
|
|
|
|
+import com.kym.DbUtil;
|
|
|
+import com.kym.JacksonUtil;
|
|
|
+import com.kym.jdbc.BasicQuery;
|
|
|
+import com.kym.jdbc.IHandler;
|
|
|
+import com.kym.jdbc.OBuilder;
|
|
|
import com.kym.jdbc.OBuilder.Where;
|
|
|
import com.kym.jdbc.SQLEntity;
|
|
|
+import com.kym.jdbc.annotations.DBF;
|
|
|
+import com.kym.jdbc.annotations.Entity;
|
|
|
+import com.kym.jdbc.annotations.FK;
|
|
|
import com.kym.jdbc.annotations.JoinType;
|
|
|
+import com.kym.jdbc.annotations.Many;
|
|
|
+import com.kym.jdbc.annotations.OP;
|
|
|
+import com.kym.jdbc.annotations.One;
|
|
|
+import com.kym.jdbc.annotations.QE;
|
|
|
+import com.kym.jdbc.annotations.QF;
|
|
|
+import com.kym.jdbc.annotations.QueryType;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
+import java.lang.reflect.Array;
|
|
|
+import java.lang.reflect.Field;
|
|
|
+import java.lang.reflect.InvocationTargetException;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Comparator;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
/**
|
|
|
@@ -50,9 +73,919 @@ public class SelectSQLExpress implements SQLExpress<SQLEntity> {
|
|
|
private final List<String> groups = new ArrayList<>();
|
|
|
|
|
|
|
|
|
+ private int dialect = SQLExpress.DIALECT_MYSQL;
|
|
|
+
|
|
|
+ public SelectSQLExpress(int dialect) {
|
|
|
+ this.dialect = dialect;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public SQLEntity toSQL() {
|
|
|
//TODO
|
|
|
return null;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 聚合函数查询<p>
|
|
|
+ * 注意:聚合函数的查询需要使用子查询</p>
|
|
|
+ *
|
|
|
+ * @param clz
|
|
|
+ * @param func 聚合查询字段 count(1) sum(amt)
|
|
|
+ * @param builder
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public SQLEntity selectFunc(Class<?> clz, String func, OBuilder builder) {
|
|
|
+ SQLEntity entity = new SQLEntity();
|
|
|
+ List<Object> parameters = new ArrayList<>(16);
|
|
|
+ boolean distinct = distinctAggerate(func);
|
|
|
+ StringBuilder sbr = new StringBuilder();
|
|
|
+ boolean originEntity = !clz.getSimpleName().endsWith("Info");
|
|
|
+ if (originEntity) {
|
|
|
+ String funcField = func;
|
|
|
+ if (!distinct) {
|
|
|
+ funcField = func.contains("COUNT(") ? "1" : func.trim().split("\\(")[1].split("\\)")[0].trim();
|
|
|
+ }
|
|
|
+ sbr.append("SELECT ").append(funcField).append(" FROM ").append(getTableName(clz, clz.getSimpleName()));
|
|
|
+ if (null != builder) {
|
|
|
+ if (!DbUtil.isEmptyOrNull(builder.getWheres())) {
|
|
|
+ List<Where> wheres = builder.getWheres();
|
|
|
+ if (!DbUtil.isEmptyOrNull(wheres)) {
|
|
|
+ sbr.append(" \r\n WHERE 1=1");
|
|
|
+ wheres.forEach(wh -> {
|
|
|
+ sbr.append(" AND ");
|
|
|
+ appendBuilderWhere(sbr, wh, "", parameters);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //GROUP BY
|
|
|
+ if (!DbUtil.isEmptyOrNull(builder.getGroupBys())) {
|
|
|
+ sbr.append(" \r\n GROUP BY ");
|
|
|
+ builder.getGroupBys().forEach(group -> {
|
|
|
+ sbr.append(group).append(" ,");
|
|
|
+ });
|
|
|
+ sbr.deleteCharAt(sbr.length() - 1);
|
|
|
+ }
|
|
|
+ //ORDER BY
|
|
|
+ if (!DbUtil.isEmptyOrNull(builder.getOrderBys())) {
|
|
|
+ sbr.append(" ORDER BY ");
|
|
|
+ builder.getOrderBys().forEach(order -> sbr.append(order).append(" ,"));
|
|
|
+ sbr.deleteCharAt(sbr.length() - 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ //count不分页
|
|
|
+ if (!func.contains("COUNT(")) {
|
|
|
+ //分页
|
|
|
+ String result = appendWhereLimit(builder, sbr);
|
|
|
+ if (null != result) {
|
|
|
+ if (!distinct) {
|
|
|
+ entity.sql = "SELECT " + func + " FROM (" + result + ") temp";
|
|
|
+ } else {
|
|
|
+ entity.sql = result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!distinct) {
|
|
|
+ entity.sql = "SELECT " + func + " FROM (" + sbr.toString() + ") temp";
|
|
|
+ } else {
|
|
|
+ entity.sql = sbr.toString();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //支持聚合查询的关联
|
|
|
+ String queryDomain = clz.getSuperclass().getCanonicalName() + "$" + clz.getSuperclass().getSimpleName() + "BasicQuery";
|
|
|
+ try {
|
|
|
+ Object obj = Class.forName(queryDomain).newInstance();
|
|
|
+ if (!DbUtil.isEmptyOrNull(func)) {
|
|
|
+ DbUtil.setFieldValue(obj, obj.getClass().getField("pageSize"), -1);
|
|
|
+ }
|
|
|
+ return select((BasicQuery) obj, builder, null, null, func, true);
|
|
|
+ } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | NoSuchFieldException e) {
|
|
|
+ logger.error("SQL2Helper ERR# initialize class,class:{}", queryDomain);
|
|
|
+ throw new IllegalStateException(e);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ entity.parameters = parameters.toArray();
|
|
|
+ return entity;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ public SQLEntity selectListByWhereV2(Class<?> clz, OBuilder builder, List<String> include, List<String> exclude, String aggregate, boolean isList) {
|
|
|
+ SQLEntity sqlEntity = new SQLEntity();
|
|
|
+ List<Object> parameters = new ArrayList<>();
|
|
|
+ Set<Field> fields = DbUtil.getEntityFields(clz);
|
|
|
+ boolean isSimple = !clz.getSimpleName().endsWith("Info");
|
|
|
+ if (isSimple) {
|
|
|
+ Entity entity = clz.getAnnotation(Entity.class);
|
|
|
+ StringBuilder sbr = new StringBuilder();
|
|
|
+ if (!DbUtil.isEmptyOrNull(aggregate)) {
|
|
|
+ sbr.append("SELECT ").append(aggregate).append(" FROM ").append(getTableName(entity));
|
|
|
+ } else {
|
|
|
+ if (DbUtil.isEmptyOrNull(include)) {
|
|
|
+ if (DbUtil.isEmptyOrNull(exclude)) {
|
|
|
+ sbr.append("SELECT * FROM ").append(getTableName(entity));
|
|
|
+ } else {
|
|
|
+ sbr.append("SELECT ");
|
|
|
+ for (Field field : fields) {
|
|
|
+ if (DbUtil.isUsageField(field)) {
|
|
|
+ //richId rich2Id 不关联查
|
|
|
+ String fileName = field.getName();
|
|
|
+ if (!exclude.contains(fileName)) {
|
|
|
+ sbr.append(getComma()).append(DbUtil.getColumnName(fileName)).append(getComma()).append(" ,");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sbr.deleteCharAt(sbr.length() - 1);
|
|
|
+ sbr.append(" \n FROM ").append(getTableName(entity));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ sbr.append("SELECT ");
|
|
|
+ for (Field field : fields) {
|
|
|
+ if (DbUtil.isUsageField(field)) {
|
|
|
+ String fileName = field.getName();
|
|
|
+ if (include.contains(fileName)) {
|
|
|
+ sbr.append(getComma()).append(DbUtil.getColumnName(fileName)).append(getComma()).append(" ,");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sbr.deleteCharAt(sbr.length() - 1);
|
|
|
+ sbr.append(" \n FROM ").append(getTableName(entity));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (null != builder && !DbUtil.isEmptyOrNull(builder.getWheres())) {
|
|
|
+ List<Where> wheres = builder.getWheres();
|
|
|
+ if (!DbUtil.isEmptyOrNull(wheres)) {
|
|
|
+ sbr.append(" \r\n WHERE 1=1");
|
|
|
+ wheres.forEach(wh -> {
|
|
|
+ sbr.append(" AND ");
|
|
|
+ appendBuilderWhere(sbr, wh, "", parameters);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (isList) {
|
|
|
+ //ORDER BY
|
|
|
+ if (null != builder && !DbUtil.isEmptyOrNull(builder.getOrderBys())) {
|
|
|
+ sbr.append(" ORDER BY ");
|
|
|
+ builder.getOrderBys().forEach(order -> sbr.append(order).append(" ,"));
|
|
|
+ sbr.deleteCharAt(sbr.length() - 1);
|
|
|
+ } else {
|
|
|
+ sbr.append(" ORDER BY update_at DESC ");
|
|
|
+ }
|
|
|
+
|
|
|
+ //limit
|
|
|
+ String result = appendWhereLimit(builder, sbr);
|
|
|
+ if (null != result) {
|
|
|
+ sqlEntity.sql = result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ sbr.append(";");
|
|
|
+ sqlEntity.sql = sbr.toString();
|
|
|
+ } else {
|
|
|
+ String queryDomain = clz.getSuperclass().getCanonicalName() + "$" + clz.getSuperclass().getSimpleName() + "BasicQuery";
|
|
|
+ Object obj;
|
|
|
+ try {
|
|
|
+ obj = Class.forName(queryDomain).getDeclaredConstructor().newInstance();
|
|
|
+ if (!DbUtil.isEmptyOrNull(aggregate)) {
|
|
|
+ DbUtil.setFieldValue(obj, obj.getClass().getField("pageSize"), -1);
|
|
|
+ }
|
|
|
+ } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | NoSuchFieldException e) {
|
|
|
+ logger.error("SQL2Helper ERR# initialize class,class:{}", queryDomain);
|
|
|
+ throw new IllegalStateException(e);
|
|
|
+ } catch (InvocationTargetException | NoSuchMethodException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ return select((BasicQuery) obj, builder, include, exclude, aggregate, isList);
|
|
|
+ }
|
|
|
+ sqlEntity.parameters = parameters.toArray();
|
|
|
+ return sqlEntity;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询SQL解析生成
|
|
|
+ *
|
|
|
+ * @param query query条件对象
|
|
|
+ * @param builder where条件对象
|
|
|
+ * @param include 指定查询字段集合
|
|
|
+ * @param exclude 指定过滤不查询字段集合
|
|
|
+ * @param aggregate 聚合查询条件
|
|
|
+ */
|
|
|
+ public SQLEntity select(BasicQuery query, OBuilder builder, List<String> include, List<String> exclude, String aggregate, boolean isList) {
|
|
|
+ SQLEntity sqlEntity = new SQLEntity();
|
|
|
+ List<Object> parameters = new ArrayList<>(32);
|
|
|
+ if (!DbUtil.isEmptyOrNull(query.includeFields)) {
|
|
|
+ if (DbUtil.isEmptyOrNull(include)) {
|
|
|
+ include = new ArrayList<>();
|
|
|
+ }
|
|
|
+ for (String includeField : query.includeFields) {
|
|
|
+ if (!include.contains(includeField)) {
|
|
|
+ include.add(includeField);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!DbUtil.isEmptyOrNull(query.excludeFields)) {
|
|
|
+ if (DbUtil.isEmptyOrNull(exclude)) {
|
|
|
+ exclude = new ArrayList<>();
|
|
|
+ }
|
|
|
+ for (String excludeField : query.excludeFields) {
|
|
|
+ if (!exclude.contains(excludeField)) {
|
|
|
+ exclude.add(excludeField);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ StringBuilder sbr = new StringBuilder();
|
|
|
+ int aliasIdx = 0;
|
|
|
+ //表别名 @QF->inner @FK、@One->left
|
|
|
+ Map<String, String> alias = new HashMap<>(4);
|
|
|
+ //关联表名
|
|
|
+ Map<String, String> tbs = new HashMap<>(4);
|
|
|
+ QE qEAnnotation = query.getClass().getAnnotation(QE.class);
|
|
|
+ String queryClassName = query.getClass().getSimpleName();
|
|
|
+ if (null == qEAnnotation) {
|
|
|
+ throw new IllegalStateException("query entity of " + queryClassName + " @Query Entity is not defined!");
|
|
|
+ }
|
|
|
+ Class<?> infoClass = qEAnnotation.clz();
|
|
|
+ Entity entity = infoClass.getSuperclass().getAnnotation(Entity.class);
|
|
|
+// Field[] fields = infoClass.getFields();
|
|
|
+ Set<Field> fields = DbUtil.getEntityFields(infoClass);
|
|
|
+ Set<Field> qfields = DbUtil.getQueryFields(query.getClass());
|
|
|
+// Field[] qfields = query.getClass().getFields();
|
|
|
+ //关联表别名
|
|
|
+ //------1.查询字段
|
|
|
+ for (Field field : fields) {
|
|
|
+ String fieldName = field.getName();
|
|
|
+ //常量字段过滤
|
|
|
+ if (!DbUtil.isUsageField(field)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ One oneAnnotation = field.getAnnotation(One.class);
|
|
|
+ Many manyAnnotation = field.getAnnotation(Many.class);
|
|
|
+ boolean isExtenstionField = null != oneAnnotation || null != manyAnnotation;
|
|
|
+ //忽略字段过滤
|
|
|
+ if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName) && !isExtenstionField) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //指定查询
|
|
|
+ if (!DbUtil.isEmptyOrNull(include) && !include.contains(fieldName) && !isExtenstionField) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ DBF DBFAnnotation = field.getAnnotation(DBF.class);
|
|
|
+ if (null != DBFAnnotation) {
|
|
|
+ FK foreignKey = field.getAnnotation(FK.class);
|
|
|
+ if (null != foreignKey) {
|
|
|
+ Class<?> entityClass = foreignKey.clz();
|
|
|
+ Entity ey = entityClass.getAnnotation(Entity.class);
|
|
|
+ for (Field qfield : qfields) {
|
|
|
+ if (qfield.isAnnotationPresent(QF.class)) {
|
|
|
+ QF qf = qfield.getAnnotation(QF.class);
|
|
|
+ String mkf = qf.pkf();
|
|
|
+ if (!DbUtil.isEmptyOrNull(mkf) && mkf.equals(fieldName)) {
|
|
|
+ if (null != DbUtil.getFieldValue(query, qfield)) {
|
|
|
+ alias.putIfAbsent(fieldName, "i" + aliasIdx++);
|
|
|
+ tbs.putIfAbsent(fieldName, getTableName(ey));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ alias.putIfAbsent(fieldName, "l" + aliasIdx++);
|
|
|
+ tbs.putIfAbsent(fieldName, getTableName(ey));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (null != oneAnnotation) {
|
|
|
+ String mkf = oneAnnotation.mkf();
|
|
|
+ if (!DbUtil.isGenericType(field.getType()) && DEFAULT_MKF.equals(mkf)) {
|
|
|
+ mkf = fieldName;
|
|
|
+ }
|
|
|
+ JoinType joinType = oneAnnotation.join();
|
|
|
+ if (JoinType.LEFT == joinType) {
|
|
|
+ alias.put(mkf, "l" + aliasIdx++);
|
|
|
+ } else if (JoinType.INNER == joinType) {
|
|
|
+ alias.put(mkf, "i" + aliasIdx++);
|
|
|
+ } else if (JoinType.RIGHT == joinType) {
|
|
|
+ alias.put(mkf, "r" + aliasIdx++);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //非聚合查询
|
|
|
+ if (DbUtil.isEmptyOrNull(aggregate)) {
|
|
|
+ sbr.append("SELECT");
|
|
|
+ //------1.查询主表字段
|
|
|
+ boolean appendFields = false;
|
|
|
+ for (Field field : fields) {
|
|
|
+ String fieldName = field.getName();
|
|
|
+ //常量字段过滤
|
|
|
+ if (!DbUtil.isUsageField(field)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ boolean isExtenstionField = field.isAnnotationPresent(One.class) || field.isAnnotationPresent(Many.class);
|
|
|
+ //忽略字段过滤
|
|
|
+ if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName) && !isExtenstionField) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //指定查询
|
|
|
+ if (!DbUtil.isEmptyOrNull(include) && !include.contains(fieldName) && !isExtenstionField) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ DBF DBFAnnotation = field.getAnnotation(DBF.class);
|
|
|
+ if (null != DBFAnnotation) {
|
|
|
+ if (appendFields) {
|
|
|
+ sbr.append(",");
|
|
|
+ }
|
|
|
+ sbr.append(" l.").append(getComma()).append(DbUtil.getColumnName(fieldName)).append(getComma());
|
|
|
+ appendFields = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //-------2.查询关联字段
|
|
|
+ for (Field field : fields) {
|
|
|
+ Class<?> type = field.getType();
|
|
|
+ String fieldName = field.getName();
|
|
|
+ //常量字段过滤
|
|
|
+ if (!DbUtil.isUsageField(field)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ boolean isExtenstionField = field.isAnnotationPresent(One.class) || field.isAnnotationPresent(Many.class);
|
|
|
+ //忽略字段过滤
|
|
|
+ if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //指定查询
|
|
|
+ if (!DbUtil.isEmptyOrNull(include) && !include.contains(fieldName)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Class<?> fieldClass = field.getType();
|
|
|
+ One oneAnnotation = field.getAnnotation(One.class);
|
|
|
+ if (null != oneAnnotation) {
|
|
|
+ //忽略查询
|
|
|
+ if (oneAnnotation.noQuery()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String fkField = oneAnnotation.mkf();
|
|
|
+ if (!DbUtil.isGenericType(field.getType()) && DEFAULT_MKF.equals(fkField)) {
|
|
|
+ fkField = fieldName;
|
|
|
+ }
|
|
|
+ // join字段
|
|
|
+ if (!DbUtil.isEmptyOrNull(fkField)) {
|
|
|
+ //1.join查询对象
|
|
|
+ if (!DbUtil.isGenericType(type) && type != String.class && !type.isArray() && !type.isAssignableFrom(List.class)) {
|
|
|
+// alias.putIfAbsent(fkField, "l" + aliasIdx++);
|
|
|
+ Field[] joinFields = fieldClass.getFields();
|
|
|
+ for (Field joinField : joinFields) {
|
|
|
+ if (DbUtil.isUsageField(joinField)) {
|
|
|
+ if (!"SELECT".contentEquals(sbr)) {
|
|
|
+ sbr.append(",");
|
|
|
+ }
|
|
|
+ sbr.append(alias.get(fkField)).append(".").append(getComma()).append(DbUtil.getColumnName(joinField.getName())).append(getComma()).append(" AS ").append(getComma()).append(fieldName).append("_").append(DbUtil.getColumnName(joinField.getName())).append(getComma());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //2.join查询变量
|
|
|
+ } else {
|
|
|
+ if (!"SELECT".equals(sbr.toString().trim())) {
|
|
|
+ sbr.append(",");
|
|
|
+ }
|
|
|
+ sbr.append(alias.get(fkField)).append(".").append(getComma()).append(DbUtil.getColumnName(oneAnnotation.tf())).append(getComma()).append(" AS ").append(getComma()).append(DbUtil.getColumnName(fieldName)).append(getComma());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /* //聚合查询需要获取关联表别名
|
|
|
+ for (Field field : fields) {
|
|
|
+ if (field.isAnnotationPresent(Fk.class)) {
|
|
|
+ alias.putIfAbsent(field.getName(), "l" + aliasIdx++);
|
|
|
+ }
|
|
|
+ }*/
|
|
|
+
|
|
|
+ String aggregateField = aggregate;
|
|
|
+ boolean distinct = distinctAggerate(aggregate);
|
|
|
+ if (!distinct) {
|
|
|
+ aggregateField = aggregate.contains("COUNT(") ? "1" : aggregate.trim().split("\\(")[1].split("\\)")[0].trim();
|
|
|
+ }
|
|
|
+ sbr.append("SELECT ").append(aggregateField);
|
|
|
+ }
|
|
|
+
|
|
|
+ sbr.append(" \n FROM ").append(getComma()).append(getTableName(entity)).append(getComma()).append(" AS l");
|
|
|
+ List<String> joined = new ArrayList<>();
|
|
|
+ //-------3.关联对象 JOINS
|
|
|
+ //BUG:涉及到关联查询的对象字段需要inner join @QF
|
|
|
+// Field[] qfs =dbu query.getClass().getDeclaredFields();
|
|
|
+ for (Field qf : qfields) {
|
|
|
+ //qf 内联查询
|
|
|
+ if (qf.isAnnotationPresent(QF.class)) {
|
|
|
+ Object val = DbUtil.getFieldValue(query, qf);
|
|
|
+ if (null != val) {
|
|
|
+ String amkf = qf.getAnnotation(QF.class).pkf();
|
|
|
+ if (!DbUtil.isEmptyOrNull(amkf)) {
|
|
|
+// if (!joinFields.contains(amkf)) {
|
|
|
+// joinFields.add(amkf);
|
|
|
+// alias.putIfAbsent(amkf, "i" + aliasIdx++);
|
|
|
+ if (!joined.contains(alias.get(amkf))) {
|
|
|
+ joined.add(alias.get(amkf));
|
|
|
+ } else {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Class<?> aliasClass = getFkDomainClass(qf, infoClass);
|
|
|
+ sbr.append(" INNER JOIN ").append(getTableName(aliasClass, aliasClass.getSimpleName())).append(" AS ").append(alias.get(amkf)).append(" ON ").append("l.").append(getComma()).append(DbUtil.getColumnName(amkf)).append(getComma()).append("=").append(alias.get(amkf)).append(".").append(getComma()).append(DbUtil.getColumnName(qf.getAnnotation(QF.class).tkf())).append(getComma());
|
|
|
+ }
|
|
|
+ }
|
|
|
+// }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (Field field : fields) {
|
|
|
+ String fieldName = field.getName();
|
|
|
+ //忽略查询
|
|
|
+ if (!DbUtil.isEmptyOrNull(exclude) && exclude.contains(fieldName)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ One oneAnnotation = field.getAnnotation(One.class);
|
|
|
+ if (null != oneAnnotation) {
|
|
|
+ //忽略查询
|
|
|
+ if (oneAnnotation.noQuery()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!DbUtil.isUsageField(field)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String mkf = oneAnnotation.mkf();
|
|
|
+ if (!DbUtil.isGenericType(field.getType()) && DEFAULT_MKF.equals(mkf)) {
|
|
|
+ mkf = fieldName;
|
|
|
+ }
|
|
|
+ //joins
|
|
|
+ if (!DbUtil.isEmptyOrNull(mkf)) {
|
|
|
+ if (!joined.contains(alias.get(mkf))) {
|
|
|
+ joined.add(alias.get(mkf));
|
|
|
+ } else {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+// joinFields.add(fkField);
|
|
|
+ Class<?> aliasClass = getFkDomainClass(field, infoClass);
|
|
|
+// alias.putIfAbsent(fkField, "l" + aliasIdx++);
|
|
|
+ if (oneAnnotation.join() == JoinType.LEFT) {
|
|
|
+ sbr.append(" \n LEFT JOIN ");
|
|
|
+ } else if (oneAnnotation.join() == JoinType.INNER) {
|
|
|
+ sbr.append(" \n INNER JOIN ");
|
|
|
+ } else {
|
|
|
+ sbr.append(" \n RIGHT JOIN ");
|
|
|
+ }
|
|
|
+ sbr.append(getTableName(aliasClass, aliasClass.getSimpleName())).append(" AS ").append(alias.get(mkf)).append(" ON ").append("l.").append(getComma()).append(DbUtil.getColumnName(oneAnnotation.mkf())).append(getComma()).append("=").append(alias.get(mkf)).append(".").append(getComma()).append(DbUtil.getColumnName(oneAnnotation.tkf())).append(getComma());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //-------4.查询条件
|
|
|
+ sbr.append(" \n WHERE 1=1 ");
|
|
|
+ Field[] queryFields = query.getClass().getDeclaredFields();
|
|
|
+ //query条件和Builder条件仅支持一个(查询时只提供一个条件构造实体)
|
|
|
+ if (null != builder && !DbUtil.isEmptyOrNull(builder.getWheres())) {
|
|
|
+ List<Where> wheres = builder.getWheres();
|
|
|
+ wheres.forEach(wh -> {
|
|
|
+ //联表查询字段
|
|
|
+ String aliasName = alias.getOrDefault(getMkf(query, wh), "l");
|
|
|
+ sbr.append(" AND ");
|
|
|
+ appendBuilderWhere(sbr, wh, aliasName, parameters);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ for (Field qf : queryFields) {
|
|
|
+ Object val = DbUtil.getFieldValue(query, qf);
|
|
|
+ String fieldName = qf.getName();
|
|
|
+ if (DbUtil.isEmptyOrNull(val)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ QF qfAnnotation = qf.getAnnotation(QF.class);
|
|
|
+ if (null == qfAnnotation) {
|
|
|
+ if (!fieldName.endsWith("Sort")) {
|
|
|
+ sbr.append(" AND l.").append(getComma()).append(DbUtil.getColumnName(fieldName)).append(getComma());
|
|
|
+ if (String.class.equals(qf.getType())) {
|
|
|
+ if (DIALECT_MYSQL == dialect) {
|
|
|
+ sbr.append(" LIKE concat('%',?,'%')");
|
|
|
+ } else if (DIALECT_PGSQL == dialect) {
|
|
|
+ sbr.append(" like concat('%',?::text,'%')");
|
|
|
+ } else if (DIALECT_MSSQL == dialect) {
|
|
|
+ sbr.append(" LIKE '%'+?+'%')");
|
|
|
+ } else if (DIALECT_ORACLE == dialect) {
|
|
|
+ sbr.append(" LIKE '%'||?||'%')");
|
|
|
+ }
|
|
|
+ parameters.add(val);
|
|
|
+ } else {
|
|
|
+ sbr.append(" = ?");
|
|
|
+ parameters.add(val);
|
|
|
+// .append(val);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //foreignKeys
|
|
|
+ String mkf = qfAnnotation.pkf();
|
|
|
+ if (qfAnnotation.qt() == QueryType.IGNORE) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!DbUtil.isEmptyOrNull(mkf)) {
|
|
|
+ String tf = qfAnnotation.tf();
|
|
|
+ if (DbUtil.isEmptyOrNull(tf)) {
|
|
|
+ logger.error("SQL2Helper ERR# [" + fieldName + "] @QF with mkf define,but without tkf exist!!!");
|
|
|
+ } else {
|
|
|
+ if (qfAnnotation.qt() == QueryType.MAIN) {
|
|
|
+ sbr.append(" AND ").append(" l").append(".").append(getComma()).append(DbUtil.getColumnName(mkf)).append(getComma());
|
|
|
+ } else {
|
|
|
+ sbr.append(" AND ").append(alias.get(mkf)).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma());
|
|
|
+ }
|
|
|
+ //字符串使用模糊查询
|
|
|
+ if (String.class.equals(qf.getType())) {
|
|
|
+ if (DIALECT_MYSQL == dialect) {
|
|
|
+ sbr.append(" like concat('%',?,'%')");
|
|
|
+ } else if (DIALECT_PGSQL == dialect) {
|
|
|
+ sbr.append(" like concat('%',?::text,'%')");
|
|
|
+ } else if (DIALECT_MSSQL == dialect) {
|
|
|
+ sbr.append(" like '%'+'?'+'%')");
|
|
|
+ } else if (DIALECT_ORACLE == dialect) {
|
|
|
+ sbr.append(" like '%'||'?'||'%')");
|
|
|
+ }
|
|
|
+ parameters.add(val);
|
|
|
+ } else {
|
|
|
+ sbr.append(" =");
|
|
|
+// parameters.add(val);
|
|
|
+ getValue(sbr, val, parameters);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ //sql
|
|
|
+ String whereSql = qfAnnotation.sql();
|
|
|
+ String tbAlias = alias.getOrDefault(qfAnnotation.pkf(), "l");
|
|
|
+ whereSql = appendWhereSql(whereSql, Collections.singletonList(val), tbAlias, parameters);
|
|
|
+ if (!DbUtil.isEmptyOrNull(whereSql)) {
|
|
|
+ sbr.append(" AND ").append(whereSql);
|
|
|
+ }
|
|
|
+ //op
|
|
|
+ String operator = qfAnnotation.op();
|
|
|
+ if (!DbUtil.isEmptyOrNull(operator)) {
|
|
|
+ String tf = qfAnnotation.tf();
|
|
|
+ if (DbUtil.isEmptyOrNull(tf)) {
|
|
|
+ logger.error("SQL2Helper ERR# " + fieldName + "@QF with operator defined,but without tkf exist!!!");
|
|
|
+ } else {
|
|
|
+ //JIN JINT
|
|
|
+ if (operator.equals(OP.JIN)) {
|
|
|
+ int loop = 1;
|
|
|
+ String each = qfAnnotation.each();
|
|
|
+ if (val instanceof Collection<?>) {
|
|
|
+ List<Object> list = JacksonUtil.toList(val);
|
|
|
+ loop = list.size();
|
|
|
+
|
|
|
+ parameters.addAll((Collection<?>) val);
|
|
|
+ } else if (val.getClass().isArray()) {
|
|
|
+ loop = Array.getLength(val);
|
|
|
+ for (int i = 0; i < loop; i++) {
|
|
|
+ parameters.add(Array.get(val, i));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ loop = 1;
|
|
|
+ parameters.add(val);
|
|
|
+ }
|
|
|
+ // and ( json_contains(l.id_list,'1'))
|
|
|
+ if (dialect == IHandler.DIALECT_MYSQL) {
|
|
|
+ sbr.append(" AND ").append("( ");
|
|
|
+ for (int i = 0; i < loop; i++) {
|
|
|
+ sbr.append(" (JSON_CONTAINS(").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append(",").append("JSON_ARRAY(?)) ");
|
|
|
+ if (i != loop - 1) {
|
|
|
+ sbr.append(each);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sbr.append(") ");
|
|
|
+ // owner_id_list::jsonb @> jsonb_build_array(2)
|
|
|
+ // owner_id_list::jsonb @> '[2]'
|
|
|
+ } else if (dialect == IHandler.DIALECT_PGSQL) {
|
|
|
+ sbr.append(" AND ").append("( ");
|
|
|
+ for (int i = 0; i < loop; i++) {
|
|
|
+ sbr.append(" (").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append("::jsonb @> ").append("jsonb_build_array(?)) ");
|
|
|
+ if (i != loop - 1) {
|
|
|
+ sbr.append(each);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sbr.append(") ");
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if (operator.equals(OP.JINT)) {
|
|
|
+
|
|
|
+ //and (JSON_OVERLAPS(role,'["a","d"]')=1)
|
|
|
+ if (dialect == IHandler.DIALECT_MYSQL) {
|
|
|
+ sbr.append(" AND ").append("(").append(operator).append("JSON_OVERLAPS(").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append(",").append("'?')=1").append(")");
|
|
|
+ parameters.add(JacksonUtil.toJSONString(val));
|
|
|
+ } else if (dialect == IHandler.DIALECT_PGSQL) {
|
|
|
+ // //ARRAY[1,4,3] && ARRAY[2,1]
|
|
|
+ sbr.append(" AND ").append("(").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append("::jsonb && ").append("jsonb_build_array(?))");
|
|
|
+ parameters.add(JacksonUtil.toJSONString(val));
|
|
|
+ }
|
|
|
+ } else if (operator.equals(OP.IN) || operator.equals(OP.NIN)) {
|
|
|
+ sbr.append(" AND ").append("(").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append(" ").append(operator).append(" (");
|
|
|
+ if (val instanceof Collection<?>) {
|
|
|
+ List<Object> list = JacksonUtil.toList(val);
|
|
|
+ String collect = list.stream().map(k -> "?").collect(Collectors.joining(","));
|
|
|
+ sbr.append(collect).append(") ) ");
|
|
|
+ parameters.addAll((Collection<?>) val);
|
|
|
+ } else if (val.getClass().isArray()) {
|
|
|
+ int length = Array.getLength(val);
|
|
|
+ for (int i = 0; i < length; i++) {
|
|
|
+ sbr.append("?");
|
|
|
+ if (i != length - 1) {
|
|
|
+ sbr.append(",");
|
|
|
+ }
|
|
|
+ parameters.add(Array.get(val, i));
|
|
|
+ }
|
|
|
+ sbr.append("))");
|
|
|
+ } else {
|
|
|
+ throw new IllegalArgumentException("不支持的参数格式");
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if (operator.equals(OP.RLK) || operator.equals(OP.LK) || operator.equals(OP.LLK)) {
|
|
|
+ sbr.append(" AND ").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append(" ").append(operator);
|
|
|
+ parameters.add(val);
|
|
|
+ } else {
|
|
|
+ sbr.append(" AND ").append(tbAlias).append(".").append(getComma()).append(DbUtil.getColumnName(tf)).append(getComma()).append(" ").append(operator);
|
|
|
+ if (qf.getType().isArray()) {
|
|
|
+ sbr.append(" (");
|
|
|
+ int length = Array.getLength(val);
|
|
|
+ for (int i = 0; i < length; i++) {
|
|
|
+ Object value = Array.get(val, i);
|
|
|
+ getValue(sbr, value, parameters);
|
|
|
+ if (i != length - 1) {
|
|
|
+ sbr.append(",");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sbr.append(")");
|
|
|
+ } else if (val instanceof Collection<?>) {
|
|
|
+ List<Object> list = JacksonUtil.toList(val);
|
|
|
+ String collect = list.stream().map(k -> "?").collect(Collectors.joining(","));
|
|
|
+ sbr.append(collect).append(") ");
|
|
|
+ parameters.addAll((Collection<?>) val);
|
|
|
+ } else {
|
|
|
+ getValue(sbr, val, parameters);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //-------6.GROUP BY
|
|
|
+ if (null != builder && !DbUtil.isEmptyOrNull(builder.getGroupBys())) {
|
|
|
+ sbr.append(" GROUP BY ");
|
|
|
+ builder.getGroupBys().forEach(group -> {
|
|
|
+ sbr.append(group).append(" ,");
|
|
|
+ });
|
|
|
+ sbr.deleteCharAt(sbr.length() - 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ //-------5.having
|
|
|
+ //todo
|
|
|
+
|
|
|
+ //-------7.ORDER BY(query)
|
|
|
+ boolean ordered = false;
|
|
|
+ //聚合查询不需要排序
|
|
|
+ if (DbUtil.isEmptyOrNull(aggregate) && isList) {
|
|
|
+ //多个排序字段需要确定先后顺序
|
|
|
+ Map<Integer, String> sortMap = new HashMap<>(16);
|
|
|
+ if (DbUtil.isEmptyOrNull(query.sortFields)) {
|
|
|
+ for (Field qf : queryFields) {
|
|
|
+ Object val = DbUtil.getFieldValue(query, qf);
|
|
|
+ if (null == val) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ int sortValue = 0;
|
|
|
+ if (val instanceof Integer) {
|
|
|
+ sortValue = (int) val;
|
|
|
+ }
|
|
|
+ if (sortValue == 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String fieldName = qf.getName();
|
|
|
+
|
|
|
+ List<Field> sorted = new ArrayList<>();
|
|
|
+ QF qfAnnotation = qf.getAnnotation(QF.class);
|
|
|
+ if (null == qfAnnotation) {
|
|
|
+ if (fieldName.endsWith("Sort")) {
|
|
|
+ if (!ordered) {
|
|
|
+ ordered = true;
|
|
|
+ sbr.append(" ORDER BY ");
|
|
|
+ }
|
|
|
+
|
|
|
+// sbr.append(" l.")
|
|
|
+// .append(getComma())
|
|
|
+// .append(DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4)))
|
|
|
+// .append(getComma());
|
|
|
+ if (sortValue % 2 == BasicQuery.SORT_ASC) {
|
|
|
+ sortMap.put(sortValue, String.format("%s ASC ", DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4))));
|
|
|
+// sbr.append(" ASC ,");
|
|
|
+ } else {
|
|
|
+// sbr.append(" DESC ,");
|
|
|
+ sortMap.put(sortValue, String.format("%s DESC ", DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4))));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!DbUtil.isEmptyOrNull(sortMap)) {
|
|
|
+ Set<Integer> integers = sortMap.keySet();
|
|
|
+ List<Integer> sorts = new ArrayList<>(integers);
|
|
|
+ sorts.sort(Comparator.comparingInt(o -> o));
|
|
|
+ sbr.append(sorts.stream().map(k -> "l." + sortMap.get(k)).collect(Collectors.joining(",")));
|
|
|
+ }
|
|
|
+ /* if (null == qfAnnotation) {
|
|
|
+ if (fieldName.endsWith("Sort")) {
|
|
|
+ if (!ordered) {
|
|
|
+ ordered = true;
|
|
|
+ sbr.append(" ORDER BY ");
|
|
|
+ }
|
|
|
+ sbr.append(" l.")
|
|
|
+ .append(getComma())
|
|
|
+ .append(DbUtil.getColumnName(fieldName.substring(0, fieldName.length() - 4)))
|
|
|
+ .append(getComma());
|
|
|
+ if (sortType == BasicQuery.SORT_ASC) {
|
|
|
+ sbr.append(" ASC ,");
|
|
|
+ } else if (sortType == BasicQuery.SORT_DESC) {
|
|
|
+ sbr.append(" desc ,");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ String[] sorts = query.sortFields;
|
|
|
+ for (String sortField : sorts) {
|
|
|
+ try {
|
|
|
+ Field sf = query.getClass().getDeclaredField(sortField + "Sort");
|
|
|
+ Object val = DbUtil.getFieldValue(query, sf);
|
|
|
+ if (null == val) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ int sortType = (int) val;
|
|
|
+ if (!ordered) {
|
|
|
+ ordered = true;
|
|
|
+ sbr.append(" ORDER BY ");
|
|
|
+ }
|
|
|
+
|
|
|
+ sbr.append(" l.").append(getComma()).append(DbUtil.getColumnName(sortField)).append(getComma());
|
|
|
+ if (sortType == BasicQuery.SORT_ASC) {
|
|
|
+ sbr.append(" ASC ,");
|
|
|
+ } else if (sortType == BasicQuery.SORT_DESC) {
|
|
|
+ sbr.append(" DESC ,");
|
|
|
+ }
|
|
|
+ } catch (NoSuchFieldException e) {
|
|
|
+ logger.warn("SQL2Helper warn# sort field is not exist,{}", sortField);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //-------7.ORDER BY(builder) 聚合查询不需要排序
|
|
|
+ if (DbUtil.isEmptyOrNull(aggregate) && isList) {
|
|
|
+ if (null != builder && !DbUtil.isEmptyOrNull(builder.getOrderBys())) {
|
|
|
+ if (!ordered) {
|
|
|
+ ordered = true;
|
|
|
+ sbr.append(" ORDER BY ");
|
|
|
+ }
|
|
|
+ builder.getOrderBys().forEach(order -> sbr.append(" l.").append(order).append(" ,"));
|
|
|
+ }
|
|
|
+ if (ordered && sbr.toString().endsWith(",")) {
|
|
|
+ sbr.deleteCharAt(sbr.length() - 1);
|
|
|
+ }
|
|
|
+ //------7.ORDER BY default update_at DESC
|
|
|
+ if (!ordered) {
|
|
|
+ sbr.append(" ORDER BY l.update_at DESC");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //-------8.limit(query)
|
|
|
+ if (isList) {
|
|
|
+ if (query.pageSize > 0) {
|
|
|
+ if (DIALECT_MYSQL == dialect) {
|
|
|
+ sbr.append(" LIMIT ");
|
|
|
+ if (query.pageIndex > 0) {
|
|
|
+ sbr.append((query.pageIndex - 1) * query.pageSize).append(",");
|
|
|
+ }
|
|
|
+ if (query.pageSize > 0) {
|
|
|
+ sbr.append(query.pageSize);
|
|
|
+ }
|
|
|
+ } else if (DIALECT_MSSQL == dialect) {
|
|
|
+ sbr.append(" OFFSET ");
|
|
|
+ if (query.pageIndex > 0) {
|
|
|
+ sbr.append((query.pageIndex - 1) * query.pageSize).append(" ROWS ");
|
|
|
+ }
|
|
|
+ if (query.pageSize > 0) {
|
|
|
+ sbr.append(" FETCH NEXT ").append(query.pageSize).append(" ROWS ONLY ");
|
|
|
+ }
|
|
|
+ } else if (DIALECT_PGSQL == dialect) {
|
|
|
+ sbr.append(" LIMIT ").append(query.pageSize);
|
|
|
+ if (query.pageIndex > 0) {
|
|
|
+ sbr.append(" OFFSET ").append((query.pageIndex - 1) * query.pageSize);
|
|
|
+ }
|
|
|
+ } else if (DIALECT_ORACLE == dialect) {
|
|
|
+ StringBuilder sr = new StringBuilder();
|
|
|
+ sr.append("SELECT * FROM (SELECT o.*,ROWNUM as rowno FROM (").append(sbr).append(") o ");
|
|
|
+ if (query.pageSize > 0) {
|
|
|
+ sr.append(" WHERE ROWNUM<=").append(query.pageSize).append(") o1");
|
|
|
+ }
|
|
|
+ if (query.pageIndex > 0) {
|
|
|
+ sr.append(" WHERE o1.rowno>").append((query.pageIndex - 1) * query.pageSize).append(";");
|
|
|
+ }
|
|
|
+ //聚合类使用子查询
|
|
|
+ if (!DbUtil.isEmptyOrNull(aggregate)) {
|
|
|
+ sqlEntity.sql = "SELECT " + aggregate + " FROM (" + sr.toString() + ") temp";
|
|
|
+ }
|
|
|
+ sqlEntity.sql = sr.toString();
|
|
|
+ }
|
|
|
+ //-------8.limit(builder)
|
|
|
+ } else {
|
|
|
+ String result = appendWhereLimit(builder, sbr);
|
|
|
+ if (null != result) {
|
|
|
+ //聚合类使用子查询
|
|
|
+ if (!DbUtil.isEmptyOrNull(aggregate) && !distinctAggerate(aggregate)) {
|
|
|
+ sbr.setLength(0);
|
|
|
+ sbr.append("SELECT ").append(aggregate).append(" FROM (").append(result).append(") temp");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ sqlEntity.sql = sbr.toString();
|
|
|
+ //聚合类使用子查询
|
|
|
+ if (!DbUtil.isEmptyOrNull(aggregate) && !distinctAggerate(aggregate)) {
|
|
|
+ String tmpSql = sbr.toString();
|
|
|
+ sbr.setLength(0);
|
|
|
+ sbr.append("SELECT ").append(aggregate).append(" FROM (").append(tmpSql).append(") temp");
|
|
|
+ }
|
|
|
+ sbr.append(";");
|
|
|
+
|
|
|
+ sqlEntity.sql = sbr.toString();
|
|
|
+ sqlEntity.parameters = parameters.toArray();
|
|
|
+ return sqlEntity;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean distinctAggerate(String aggregate) {
|
|
|
+ return aggregate.toLowerCase().contains("distinct(");
|
|
|
+ }
|
|
|
+
|
|
|
+ private void getValue(StringBuilder sbr, Object value, List<Object> parameters) {
|
|
|
+ if (null != value) {
|
|
|
+ sbr.append("?");
|
|
|
+ parameters.add(value);
|
|
|
+ } else {
|
|
|
+ throw new IllegalArgumentException("append value with NULL");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private String appendWhereLimit(OBuilder OBuilder, StringBuilder sbr) {
|
|
|
+ if (null != OBuilder) {
|
|
|
+ if (OBuilder.limitDelta() > 0) {
|
|
|
+ if (DIALECT_MYSQL == dialect) {
|
|
|
+ sbr.append(" LIMIT ");
|
|
|
+ if (OBuilder.limitStart() > 0) {
|
|
|
+ sbr.append(OBuilder.limitStart()).append(",");
|
|
|
+ }
|
|
|
+ if (OBuilder.limitDelta() > 0) {
|
|
|
+ sbr.append(OBuilder.limitDelta());
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ } else if (DIALECT_MSSQL == dialect) {
|
|
|
+ sbr.append(" OFFSET ");
|
|
|
+ if (OBuilder.limitStart() >= 0) {
|
|
|
+ sbr.append(OBuilder.limitStart()).append(" ROWS ");
|
|
|
+ }
|
|
|
+ if (OBuilder.limitDelta() > 0) {
|
|
|
+ sbr.append(" FETCH NEXT ").append(OBuilder.limitDelta()).append(" ROWS ONLY ");
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ } else if (DIALECT_PGSQL == dialect) {
|
|
|
+ sbr.append(" LIMIT ");
|
|
|
+
|
|
|
+ if (OBuilder.limitDelta() > 0) {
|
|
|
+ sbr.append(OBuilder.limitDelta());
|
|
|
+ }
|
|
|
+ if (OBuilder.limitStart() >= 0) {
|
|
|
+ sbr.append(" OFFSET ").append(OBuilder.limitStart());
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ } else if (DIALECT_ORACLE == dialect) {
|
|
|
+ StringBuilder sr = new StringBuilder();
|
|
|
+ sr.append("SELECT * FROM (SELECT o.*,ROWNUM as rowno FROM (").append(sbr.toString()).append(") o ");
|
|
|
+ if (OBuilder.limitDelta() > 0) {
|
|
|
+ sr.append(" WHERE ROWNUM<=").append(OBuilder.limitDelta()).append(") o1");
|
|
|
+ }
|
|
|
+ if (OBuilder.limitStart() >= 0) {
|
|
|
+ sr.append(" WHERE o1.rowno>").append(OBuilder.limitStart());
|
|
|
+ }
|
|
|
+ return sr.toString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|