?
在工作中经常遇到明细查询,前段有很多查询条件,但是不是每次所有条件都录入,这样就用到了我下边的方法,用于解决前端查询条件过多,并且不好判断哪些是有效(输入即为有效)的查询条件。首先用一个DTO来接收所有条件(包括录入和未录入的),之后再用下面通过方法来过滤这个DTO,把有效的条件放在Map中返回。
DTO就是简单的bean对象,这里不写了。把处理方法贴出来,在main方法中有具体使用方法。
?
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");
}
}
}
?
?
?
?
?
?
原文:http://ysj5125094.iteye.com/blog/2155639