package com.product.data.center.entity; import com.product.common.lang.StringUtils; import com.product.core.entity.DataTableEntity; import com.product.core.exception.BaseException; import com.product.data.center.config.ErrorCode; import com.product.data.center.utils.BatchUtils; import com.product.data.center.utils.CallBackReturnValue; import com.product.datasource.config.DataBaseType; import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * 查询实体类 * * @author cheng * @date 2022年07月14日10:26:22 */ public class QueryDataConfigEntity { /** * 查询表名 */ private String queryTable; /** * 需要查询的字段集合 */ private Set queryFieldSet; /** * 自动递增主键字段 */ private String autoIncrementPrimaryField; /** * 查询条件 * 支持占位符 */ private String queryFilter; /** * 占位符参数 */ private Object[] params; /** * 数据库类型 */ private DataBaseType dbt; /** * @param queryTable * @param queryFilter * @param params */ public QueryDataConfigEntity(String queryTable, String queryFilter, String autoIncrementPrimaryField, Object[] params) { this.queryTable = queryTable; this.queryFilter = queryFilter; this.params = params; this.autoIncrementPrimaryField = autoIncrementPrimaryField; } /** * @param queryTable * @param queryFilter */ public QueryDataConfigEntity(String queryTable, String queryFilter, String autoIncrementPrimaryField) { this.queryTable = queryTable; this.queryFilter = queryFilter; this.autoIncrementPrimaryField = autoIncrementPrimaryField; } /** * @param queryTable * @param queryFieldSet * @param queryFilter * @param params */ public QueryDataConfigEntity(String queryTable, Set queryFieldSet, String autoIncrementPrimaryField, String queryFilter, Object[] params) { this.queryTable = queryTable; this.queryFieldSet = queryFieldSet; this.queryFilter = queryFilter; this.params = params; this.autoIncrementPrimaryField = autoIncrementPrimaryField; } /** * 添加查询字段 * * @param fieldName */ public void addQueryField(String... fieldName) { if (fieldName != null) { if (this.queryFieldSet == null) { this.queryFieldSet = new HashSet<>(); } this.queryFieldSet.addAll(Arrays.asList(fieldName)); } } /** * 删除查询字段 * * @param fieldName */ public void removeQueryField(String... fieldName) { this.querySqlSuccess = false; if (fieldName != null && this.queryFieldSet != null && this.queryFieldSet.size() > 0) { for (String field : fieldName) { this.queryFieldSet.remove(field); } } } public String getQueryTable() { return queryTable; } public void setQueryTable(String queryTable) { this.querySqlSuccess = false; this.queryTable = queryTable; } public Set getQueryFieldSet() { return queryFieldSet; } public void setQueryFieldSet(Set queryFieldSet) { this.querySqlSuccess = false; this.queryFieldSet = queryFieldSet; } public String getQueryFilter() { return queryFilter; } public void setQueryFilter(String queryFilter) { this.querySqlSuccess = false; this.queryFilter = queryFilter; } public Object[] getParams() { return params; } public void setParams(Object[] params) { this.params = params; } public DataBaseType getDbt() { return dbt; } public void setDbt(DataBaseType dbt) { this.querySqlSuccess = false; this.dbt = dbt; } public String getAutoIncrementPrimaryField() { return autoIncrementPrimaryField; } public void setAutoIncrementPrimaryField(String autoIncrementPrimaryField) { this.autoIncrementPrimaryField = autoIncrementPrimaryField; } /** * 查询sql状态 是否初始化模板完成 */ private boolean querySqlSuccess = false; private String sqlTemplate; /** * 获取查询sql * * @param currentPage 当前页数 * @param pageSize 每页条数 * @return */ public String getQuerySql(int currentPage, int pageSize) throws BaseException { if (!this.querySqlSuccess) { this.initQuerySqlTemplate(); } int first = -1; int second = -1; if (DataBaseType.ORACLE.equals(this.dbt)) { first = currentPage * pageSize; second = (currentPage - 1) * pageSize; } else if (DataBaseType.MYSQL.equals(this.dbt)) { if (currentPage == 1) { first = 0; } else { first = (currentPage - 1) * pageSize; } second = pageSize; } else if (DataBaseType.SQLSERVER.equals(this.dbt)) { first = pageSize; second = (currentPage - 1) * pageSize; } else if (DataBaseType.INFORMIX.equals(this.dbt)) { first = (currentPage - 1) * pageSize; second = pageSize; } else if (DataBaseType.PSQL.equals(this.dbt)) { first = pageSize; second = pageSize * (currentPage - 1); } else { throw new BaseException(ErrorCode.NONSUPPORT_DATABASE_TYPE); } return sqlTemplate.replace("<<~1~>>", first + "").replace("<<~2~>>", second + ""); } public String getQueryTotalCountSql() { StringBuilder sql = new StringBuilder("SELECT "); sql.append("count(").append(this.autoIncrementPrimaryField).append(") as total_count FROM "); sql.append(this.queryTable); if (!StringUtils.isEmpty(this.queryFilter)) { sql.append(" WHERE ( ").append(this.queryFilter).append(" ) "); } return sql.toString(); } /** * 初始化查询sql */ private void initQuerySqlTemplate() { if (this.queryFieldSet == null || this.queryFieldSet.size() <= 0) { throw new BaseException(ErrorCode.BATCH_EXECUTE_QUERY_FIELD_CAN_NOT_EMPTY); } StringBuilder queryTemplate = new StringBuilder("SELECT "); if (DataBaseType.INFORMIX.equals(this.dbt)) { queryTemplate.append(" SKIP <<~1~>> FIRST <<~2~>> "); } else if (DataBaseType.SQLSERVER.equals(this.dbt)) { // queryTemplate.append(" TOP <<~1~>> "); // TODO: 2022/7/25 暂未实现sqlserver查询 } String[] fields = this.queryFieldSet.stream().toArray(String[]::new); for (int i = 0; i < fields.length; i++) { if (i > 0) { queryTemplate.append(" , "); } queryTemplate.append(BatchUtils.getFieldName(fields[i], this.dbt)); } if (!this.queryFieldSet.contains(autoIncrementPrimaryField)) { queryTemplate.append(",").append(BatchUtils.getFieldName(this.autoIncrementPrimaryField, this.dbt)); } //ORACLE 特殊查询出序号用于分页 if (DataBaseType.ORACLE.equals(this.dbt)) { queryTemplate.append(""); } queryTemplate.append(" FROM ").append(this.queryTable); //是否拼接了WHERE 关键字 boolean isWhere = false; if (!StringUtils.isEmpty(this.queryFilter)) { isWhere = true; queryTemplate.append(" WHERE ").append("(").append(this.queryFilter).append(") "); } if (DataBaseType.ORACLE.equals(this.dbt)) { queryTemplate.append(" order by ").append(BatchUtils.getFieldName(this.autoIncrementPrimaryField, this.dbt)).append(" asc "); queryTemplate.insert(0, "SELECT aa.*,ROWNUM as row_num FROM ( "); queryTemplate.append(" ) aa "); queryTemplate.append(" WHERE ( ").append(" ROWNUM<=<<~1~>> ) "); queryTemplate.insert(0, " SELECT * FROM ("); queryTemplate.append(" ) A where (row_num> <<~2~>> )"); } else { queryTemplate.append(" order by ").append(BatchUtils.getFieldName(this.autoIncrementPrimaryField, this.dbt)).append(" asc "); } if (this.dbt.equals(DataBaseType.MYSQL)) { queryTemplate.append(" limit <<~1~>>,<<~2~>>"); } this.sqlTemplate = queryTemplate.toString(); this.querySqlSuccess = true; } public static void main(String[] args) { StringBuilder sql = new StringBuilder(); sql.append("SELECT *,ROWNNUM from TABLE where 1=1"); sql.append(" order by xxx"); sql.insert(0, " SELECT *,ROWNUM as row_num FROM ("); sql.append(" ) A "); // sql.append(") a ORDER BY XXX"); sql.insert(0, " SELECT * FROM ("); sql.append(") A "); System.out.println(sql); } }