使用hibernate自定义sql查询的时候,查询到的结果集有时候根据需求返回的是List集合里面装的数据库每一列的Map集合。需要将这些集合转换为某种与Map中键对应的对象,写了个用反射和泛型的工具方法。经验不多,有错误的指出来。
贴上工具方法代码
/**
* 自定义Sql转换为对应的对象的集合
* @param obj 目标对象
* @param source 结果集对象
* @return 对应的对象的集合
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static<T> List<T> mapConversionObjList(Class<T> clazz , List source){
List<T> result = new ArrayList<T>();//用来返回的集合对象
try {
Method[] methods = clazz.getMethods();//获取目标对象中的所有方法,包括继承的方法
Set<String> methodSet = new HashSet<String>();//存储单词首字母大写的属性名
for (Method method : methods) {//遍历方法对象
String methodName = method.getName();//获取变得方法对象的方法名
if(methodName.contains("set")){
//只取类中的set或get方法
methodSet.add(method.getName().substring(3));
}
}
/*System.out.print(methodSet);*/
for (Object object : source) {//遍历待转换的源集合对象
Map<String, Object> map = (Map<String, Object>) object;//将其每个对象转换为map
if(map != null){
T resultObj = clazz.newInstance();//创建目标对象的实例,通过 clazz.newInstance() 创建
for (String methodName : methodSet) {//遍历对象中的属性名
Method method = clazz.getDeclaredMethod("set" + methodName, String.class);//获取目标对象中对应的方法,设置方法的参数类型Stirng.class
method.invoke(resultObj, map.get(methodName) != null
? map.get(methodName).toString() : "");//调用对应的方法,第一个参数为调用方法的实例,第二个参数为调用方法时的参数。
}
result.add(resultObj);//将设置好属性的对象放入返回集合对象中。
}
}
} catch (Exception e2) {
// TODO: handle exception
log.info(MiscUtil.traceInfo(e2));
}
return result;
}
目标对象
class Demo{
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
调用方法
List list = new ArrayList();
Map<String, Object> map = new HashMap<String, Object>();
map.put("Name", "Zain");
map.put("Age", "20");
list.add(map);
mapConversionObjList(Demo.class, list);
//方法将返回一个List<Demo>的集合对象;