组装sql关联查询的sql语句bug
Frank.Huang 发布于102月前 3答/1977阅

我想实现的功能:


过程中遇到的问题:

组装sql关联查询的sql语句中查询条件是根据现实的sql类型,是不是应该根据控件类型

我的分析过程如下:

public static String getWhere(Controller c, List eis, List parmList, String where) {

               ...

 这里要根据data_type组装sql,根据控件类型导致数字类型的关联查询错误

            // 文本类型查询条件为模糊匹配
            if (ei.getStr("type").equals(MetaField.TYPE_TEXT) || ei.getStr("type").equals(MetaField.TYPE_TEXTS)) {
                sb.append(" and " + key + " like ?");
                parmList.add("%" + value + "%");
            } else if (ei.getStr("type").equals(MetaField.TYPE_TIME)) {
                if (xx.isOracle()) {
                    sb.append(" and " + key + " >= to_date(?,'yyyy-mm-dd') and " + key + " < to_date(?,'yyyy-mm-dd')+1");
                } else {
                    sb.append(" and date(" + key + ") >= ? and date(" + key + ") <= ?");
                }
                parmList.add(startTime);
                parmList.add(endTime);
            } else {
                if (ei.getBoolean("is_multiple")) {
                    // 多值条件
                    sb.append(" and (");
                    for(String val : value.split(",")){
                        if (!sb.toString().endsWith(" (")) {
                            sb.append(" or ");
                        }
                        sb.append(key + " like ");
                        sb.append("?");
                        parmList.add('%' + val + '%');
                    }
                    sb.append(")");
                } else {
                    // 单值条件
                    sb.append(" and " + key + " = ?");
                    parmList.add(value);
                }
            }

            // 保持条件值回显
            ei.put("value", value);
        }

        // 动态解析变量和逻辑运算
        Object obj = c.getSessionAttr(EovaConst.USER);
        return DynamicParse.buildSql(sb.toString(), obj/*c.getSessionAttr(EovaConst.USER)*/);
    }





[沙发] Jieven
Eova V1.6已经重构了这块,会引入字段的数据类型可实现更精准的查询条件!
[地板] Jieven
Eova V1.6已经重构了这块,会引入字段的数据类型可实现更精准的查询条件!
[地毯] Frank.Huang
//临时解决方案
			//文本类型查询条件为模糊匹配
			if (ei.getStr("data_type").equals(MetaField.DATATYPE_STRING)) {
				sb.append(" and " + key + " like ?");
				parmList.add("%" + value + "%");
			} else if (ei.getStr("data_type").equals(MetaField.DATATYPE_TIME)) {
				if (xx.isOracle()) {
					sb.append(" and " + key + " >= to_date(?,'yyyy-mm-dd') and " + key + " < to_date(?,'yyyy-mm-dd')+1");
				} else {
					sb.append(" and date(" + key + ") >= ? and date(" + key + ") <= ?");
				}
				parmList.add(startTime);
				parmList.add(endTime);
			} else {
                                 //对于多个值判断这块也有问题,对于字符串类型和数字类型都可能会有多个值,暂时没用到,暂不不修改
				if (ei.getBoolean("is_multiple")) {
					// 多值条件
					sb.append(" and (");
					for(String val : value.split(",")){
						if (!sb.toString().endsWith(" (")) {
							sb.append(" or ");
						}
						sb.append(key + " like ");
						sb.append("?");
						parmList.add('%' + val + '%');
					}
					sb.append(")");
				} else {
					// 单值条件
					sb.append(" and " + key + " = ?");
					parmList.add(value);
				}
			}
提交评论