当数据库字段的类型为数字型,如为integer类型时,如果把该字段设置为查询条件,并且为范围查询,如下:
<t:dgCol title="统计日期" field="sumDate" query="true" queryMode="group"></t:dgCol>
其中sumDate在数据库中是int型的,这时生成的界面如下:
这时如果输入一个数字型的值,如20150401,会报类型转换错误。
原因是在org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil的这个类中的installHqlJoinAlias方法中拼装查询条件时没有根据字段的类型来判断,原来的代码是这样子的:
// 添加 判断是否有区间值 String beginValue = null; String endValue = null; ... //这边没有判断当前的字段是什么类型统一传的都是String类型的值,当字段类型为数字型时会出错 ObjectParseUtil.addCriteria(cq, aliasName,HqlRuleEnum.GE, beginValue); ObjectParseUtil.addCriteria(cq, aliasName,HqlRuleEnum.LE, endValue);
我的解决方案是根据字段的类型判断判断需要传入的类型,如下,
//单独写一个方法来处理类型的判断和转换 private static void addCriteria(String value, CriteriaQuery cq, String aliasName, HqlRuleEnum rule, String type) { if (StringUtil.isNotEmpty(value)) { if (type.equals("class java.lang.Integer")) { ObjectParseUtil.addCriteria(cq, aliasName, rule, new Integer(value)); } else if (type.equals("class java.lang.Long")) { ObjectParseUtil.addCriteria(cq, aliasName, rule, new Integer(value)); } else if (type.equals("class java.lang.Double")) { ObjectParseUtil.addCriteria(cq, aliasName, rule, new Double(value)); } else if (type.equals("class java.lang.Float")) { ObjectParseUtil.addCriteria(cq, aliasName, rule, new Float(value)); } else { ObjectParseUtil.addCriteria(cq, aliasName, rule, value); } } }
修改后的代码如下:
addCriteria(beginValue, cq, aliasName, HqlRuleEnum.GE, type); addCriteria(endValue, cq, aliasName, HqlRuleEnum.LE, type); //这边没有判断当前的字段是什么类型统一传的都是String类型的值,当字段类型为数字型时会出错 //ObjectParseUtil.addCriteria(cq, aliasName,HqlRuleEnum.GE, beginValue); //ObjectParseUtil.addCriteria(cq, aliasName,HqlRuleEnum.LE, endValue); }