?
在工作中经常遇到明细查询,前段有很多查询条件,但是不是每次所有条件都录入,这样就用到了我下边的方法,用于解决前端查询条件过多,并且不好判断哪些是有效(输入即为有效)的查询条件。首先用一个DTO来接收所有条件(包括录入和未录入的),之后再用下面通过方法来过滤这个DTO,把有效的条件放在Map中返回。
DTO就是简单的bean对象,这里不写了。把处理方法贴出来,在main方法中有具体使用方法。
?
class="java">package com.yusj; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import com.sim.machine.web.dto.QueryPermissionOprtDto; /** * * @ClassName: QueryBaseDto * @Description: 用于过滤哪些查询条件有效 * @author shaojian.yu * @date 2014年10月27日 下午2:32:35 * */ public class QueryBaseDtoUtils { /** * * @Title:getFiledValues * @Description: 根据对象获取属性值 * @author shaojian.yu * @date 2014年10月27日 下午2:33:05 * @param o * @return */ public static Object[] getFiledValues(Object o) { String[] fieldNames = getFiledName(o); Object[] value = new Object[fieldNames.length]; for (int i = 0; i < fieldNames.length; i++) { value[i] = getFieldValueByName(fieldNames[i], o); } return value; } /** * * @Title:getFiledName * @Description: 获取属性名数组 * @author shaojian.yu * @date 2014年10月27日 下午2:33:35 * @param o * @return */ public static String[] getFiledName(Object o) { Field[] fields = o.getClass().getDeclaredFields(); String[] fieldNames = new String[fields.length]; for (int i = 0; i < fields.length; i++) { // System.out.println(fields[i].getType()); fieldNames[i] = fields[i].getName(); } return fieldNames; } /** * * @Title:getFieldValueByName * @Description: 根据属性名获取属性值 * @author shaojian.yu * @date 2014年10月27日 下午2:33:48 * @param fieldName * @param o * @return */ public static Object getFieldValueByName(String fieldName, Object o) { try { String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = "get" + firstLetter + fieldName.substring(1); Method method = o.getClass().getMethod(getter, new Class[] {}); Object value = method.invoke(o, new Object[] {}); return value; } catch (Exception e) { return null; } } /** * * @Title:getParamList * @Description: 获取有效的查询条件 * @author shaojian.yu * @date 2014年10月27日 下午2:49:04 * @param o * @return */ public static Map<String, Object> getParamMap(Object o) { Map<String, Object> resultMap = new HashMap<String, Object>(); String[] fieldNames = getFiledName(o); for (String field : fieldNames) { Object obj = getFieldValueByName(field, o); if (StringUtil.checkNotNull((String) obj)) { resultMap.put(field, obj); } } return resultMap; } public static void main(String[] args) { // 要检测的查询数据对象 TestDto dto = new TestDto(); // DOJO dto.setFid("123"); dto.setName("1110"); // 获取所有属性列 Map<String, Object> paramMap = QueryBaseDtoUtils.getParamMap(dto); for (Entry<String, Object> entry : paramMap.entrySet()) { // 拼接查询语句时,可以直接将Key做为字段名value做为查询条件(前提是DTO中的属性名要与Model中的相同,没有多表关联可以直接用Model). System.out.println(entry.getKey() + ":" + entry.getValue() + "\t"); } } }
?
?
?
?
?
?