Files
geg-gas-pcitc/itc-pcitc-dependencies/itc-pcitc-dependencies-service/src/main/java/com/pictc/jdbc/QueryParameterUtils.java
2025-10-10 09:20:48 +08:00

176 lines
4.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.pictc.jdbc;
import java.util.ArrayList;
import java.util.List;
import com.pictc.jdbc.model.Criteria;
import com.pictc.jdbc.model.CriteriaGroup;
import com.pictc.jdbc.model.JdbcParam;
import com.pictc.jdbc.model.JdbcType;
import com.pictc.jdbc.model.Link;
import com.pictc.jdbc.model.QueryOrder;
import com.pictc.jdbc.model.Criteria.DataType;
import com.pictc.jdbc.model.QueryOrder.QueryOrderType;
import com.pictc.utils.StringUtils;
public class QueryParameterUtils {
private static final String TBL_ALIAS = "t";
public static List<JdbcParam> toJdbcParams(SqlBuilder sql,List<CriteriaGroup> groups) {
List<JdbcParam> params = new ArrayList<JdbcParam>();
boolean hasWhere = false;
if(groups!=null && !groups.isEmpty()) {
for (CriteriaGroup group : groups) {
List<Criteria> cris = group.getCriterias();
if(cris==null || cris.isEmpty()) {
continue;
}
if(!hasWhere) {
hasWhere = true;
sql.where();
}else {
if(group.getLink()==Link.AND) {
sql.and();
}else {
sql.or();
}
}
sql.leftBracket();
boolean c_flag = false;
for (Criteria criteria : cris) {
if(!c_flag) {
c_flag = true;
}else {
if(criteria.getLink()==Link.AND) {
sql.and();
}else {
sql.or();
}
}
if(criteria.isNot()) {
sql.not();
}
String col = convertHump(criteria.getField());
if(criteria.getDataType()==DataType.STRING) {
sql.append("IFNULL(");
sql.append(TBL_ALIAS).dot().appendSeparator(col);
sql.append(",'')");
}else {
sql.append(TBL_ALIAS).dot().appendSeparator(col);
}
JdbcType jdbc = criteria.getJdbc();
int valueType = 0;
switch (criteria.getType()) {
case NULL:
valueType = -1;
sql.isNull();
break;
case EQ:
sql.eq().placeholder();
break;
case LIKE:
sql.like().placeholder();
break;
case GT:
sql.gt().placeholder();
break;
case EQ_GT:
sql.gtEq().placeholder();
break;
case LT:
sql.lt().placeholder();
break;
case EQ_LT:
sql.ltEq().placeholder();
break;
case BETWEEN:
valueType = 1;
if(criteria.getVal()==null || criteria.getSecondVal()==null) {
throw new RuntimeException(StringUtils.format("filed:[{0}] --> 条件BETWEEN 值不能为空!", criteria.getField()));
}
sql.between().placeholder().and().placeholder();
params.add(new JdbcParam().setJdbc(jdbc.getJdbc()).setJavaType(jdbc.getJavaClass()).setVal(criteria.getVal()));
params.add(new JdbcParam().setJdbc(jdbc.getJdbc()).setJavaType(jdbc.getJavaClass()).setVal(criteria.getSecondVal()));
break;
case IN:
valueType = 2;
//criteria.getListVal()
if(criteria.getListVal()==null || criteria.getListVal().isEmpty()) {
throw new RuntimeException(StringUtils.format("filed:[{0}] --> 条件IN 值不能为空!", criteria.getField()));
}
sql.inStart();
boolean inFlag = false;
for (Object val : criteria.getListVal()) {
if(!inFlag) {
inFlag = true;
}else {
sql.comma();
}
sql.placeholder();
params.add(new JdbcParam().setJdbc(jdbc.getJdbc()).setJavaType(jdbc.getJavaClass()).setVal(val));
}
sql.inEnd();
break;
default:
break;
}
if(valueType==0) {
params.add(new JdbcParam().setJdbc(jdbc.getJdbc()).setJavaType(jdbc.getJavaClass()).setVal(criteria.getVal()));
}
}
sql.rightBracket();
}
}
return params;
}
public static void parseOrders(SqlBuilder builder,List<QueryOrder> orders) {
if(orders!=null) {
boolean flag = false;
for (QueryOrder order : orders) {
if(order.getType()==QueryOrderType.NONE) {
continue;
}
if(!flag) {
builder.orderBy();
flag = true;
}else {
builder.comma();
}
String col = convertHump(order.getField());
builder.space().append(TBL_ALIAS).dot().appendSeparator(col);
if(order.getType()==QueryOrderType.ASC) {
builder.asc();
}else {
builder.desc();
}
}
}
}
/**
* 将驼峰命名的字符串转为下划线
* */
public static String convertHump(String str) {
StringBuilder result=new StringBuilder();
char[] chars=str.toCharArray();
for (int i = 0; i < chars.length; i++) {
if(Character.isUpperCase(chars[i])) {
if(i>0) {
result.append('_');
}
result.append(Character.toLowerCase(chars[i]));
continue;
}
result.append(chars[i]);
}
return result.toString();
}
}