Skip to content

QueryGenerator.installMplus()未处理@TableField(exist = false)导致构建查询出现column "xxx" does not exist #1680

Closed
@tanglinyan

Description

@tanglinyan
版本号:2.0.2(发布日期:20190708)
问题描述:

org.jeecg.common.system.query.QueryGenerator.installMplus()未对entity里的使用@TableField(exist = false)注解的属性进行忽略,导致构建查询的时候出现ERROR: column "xxx" does not exist

截图&代码:

image

友情提示: 未按格式要求发帖,会直接删掉。

Activity

zhangdaiscott

zhangdaiscott commented on Sep 10, 2020

@zhangdaiscott
Member

已经修复,下个版本发布

zhangdaiscott

zhangdaiscott commented on Sep 10, 2020

@zhangdaiscott
Member
Object value = PropertyUtils.getSimpleProperty(searchObj, name);
//如果字段加注解了@TableField(exist = false),不走DB查询
//TODO 存在缺陷,这个写法 clazz.getDeclaredField(name) 获取不到继承的父实体字段
try {
	if (oConvertUtils.isNotEmpty(value)) {
		Field field = searchObj.getClass().getDeclaredField(name);
		if (field != null) {
			TableField tableField = field.getAnnotation(TableField.class);
			if (tableField != null && tableField.exist() == false) {
				continue;
			}
		}
	}
} catch (Exception e) {
	e.printStackTrace();
}
tanglinyan

tanglinyan commented on Sep 10, 2020

@tanglinyan
Author

收到,稍后我参考mybatis-plus是如何解析TableField注解的再进行改进

tanglinyan

tanglinyan commented on Sep 10, 2020

@tanglinyan
Author
public static void installMplus(QueryWrapper<?> queryWrapper,Object searchObj,Map<String, String[]> parameterMap) {
		
		/*
		 * 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code}
		但是不支持在自定义SQL中写orgCode in #{sys_org_code} 
		当一个人只有一个部门 就直接配置等于条件: orgCode 等于 #{sys_org_code} 或者配置自定义SQL: orgCode = '#{sys_org_code}'
		*/
		
		//区间条件组装 模糊查询 高级查询组装 简单排序 权限查询
		//-- PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(searchObj);
		//TODO 强依赖mybatis plus内部获取所有字段方法来取代PropertyUtils.getPropertyDescriptors,获取所有字段的同时也忽略了@TableField(exist = false)
		List<Field> allFieldList = TableInfoHelper.getAllFields(searchObj.getClass());

		Map<String,SysPermissionDataRuleModel> ruleMap = getRuleMap();
		
		//权限规则自定义SQL表达式
		for (String c : ruleMap.keySet()) {
			if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){
				queryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue())));
			}
		}
		
		String name, type;
		//-- for (int i = 0; i < origDescriptors.length; i++) {
		for (int i = 0; i < allFieldList.size(); i++) {
			//aliasName = origDescriptors[i].getName();  mybatis  不存在实体属性 不用处理别名的情况
			//-- name = origDescriptors[i].getName();
			//-- type = origDescriptors[i].getPropertyType().toString();
			Field tempField = allFieldList.get(i);
			name = tempField.getName();
			type = tempField.getType().toString();
			try {
				//TODO 这里是否直接可以使用tempField.isAccessible()来取代PropertyUtils.isReadable(),PropertyUtils.isReadable()内部对get/set方法的可见性也做处理了
				if (judgedIsUselessField(name)|| !PropertyUtils.isReadable(searchObj, name)) {
					continue;
				}

				//数据权限查询
				if(ruleMap.containsKey(name)) {
					//-- addRuleToQueryWrapper(ruleMap.get(name), name, origDescriptors[i].getPropertyType(), queryWrapper);
					//TODO origDescriptors[i].getPropertyType()好像获取了get/set方法的返回值类型
					addRuleToQueryWrapper(ruleMap.get(name), name,tempField.getType(), queryWrapper);
				}
				
				// 添加 判断是否有区间值
				String endValue = null,beginValue = null;
				if (parameterMap != null && parameterMap.containsKey(name + BEGIN)) {
					beginValue = parameterMap.get(name + BEGIN)[0].trim();
					addQueryByRule(queryWrapper, name, type, beginValue, QueryRuleEnum.GE);
					
				}
				if (parameterMap != null && parameterMap.containsKey(name + END)) {
					endValue = parameterMap.get(name + END)[0].trim();
					addQueryByRule(queryWrapper, name, type, endValue, QueryRuleEnum.LE);
				}
				//多值查询
				if (parameterMap != null && parameterMap.containsKey(name + MULTI)) {
					endValue = parameterMap.get(name + MULTI)[0].trim();
					addQueryByRule(queryWrapper, name.replace(MULTI,""), type, endValue, QueryRuleEnum.IN);
				}

				//判断单值  参数带不同标识字符串 走不同的查询
				//TODO 这种前后带逗号的支持分割后模糊查询需要否 使多选字段的查询生效
				Object value = PropertyUtils.getSimpleProperty(searchObj, name);
				if (null != value && value.toString().startsWith(COMMA) && value.toString().endsWith(COMMA)) {
					String multiLikeval = value.toString().replace(",,", COMMA);
					String[] vals = multiLikeval.substring(1, multiLikeval.length()).split(COMMA);
					final String field = oConvertUtils.camelToUnderline(name);
					if(vals.length>1) {
						queryWrapper.and(j -> {
							j = j.like(field,vals[0]);
							for (int k=1;k<vals.length;k++) {
								j = j.or().like(field,vals[k]);
							}
							//return j;
						});
					}else {
						queryWrapper.and(j -> j.like(field,vals[0]));
					}
				}else {
					//根据参数值带什么关键字符串判断走什么类型的查询
					QueryRuleEnum rule = convert2Rule(value);
					value = replaceValue(rule,value);
					// add -begin 添加判断为字符串时设为全模糊查询
					//if( (rule==null || QueryRuleEnum.EQ.equals(rule)) && "class java.lang.String".equals(type)) {
						// 可以设置左右模糊或全模糊,因人而异
						//rule = QueryRuleEnum.LIKE;
					//}
					// add -end 添加判断为字符串时设为全模糊查询
					addEasyQuery(queryWrapper, name, rule, value);
				}
				
			} catch (Exception e) {
				log.error(e.getMessage(), e);
			}
		}
		// 排序逻辑 处理 
		doMultiFieldsOrder(queryWrapper, parameterMap);
				
		//高级查询
		doSuperQuery(queryWrapper, parameterMap);
		
	}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @zhangdaiscott@tanglinyan

        Issue actions

          QueryGenerator.installMplus()未处理@TableField(exist = false)导致构建查询出现column "xxx" does not exist · Issue #1680 · jeecgboot/JeecgBoot