/**
*
* SolrDocument与实体类转换
*
* @param document
* SolrDocument对象
* @param clzz
* 泛型类
* @return <T>
*/
public static <T> T solrDocumentToPojo(SolrDocument document, Class<T> clzz) {
if (null != document) {
try {
Object obj = clzz.newInstance();
Method m = null;
Class<?> fieldType = null;
for (String fieldName : document.getFieldNames()) {
//需要说明的是返回的结果集中的FieldNames()比类属性多
Field[] filedArrays = clzz.getDeclaredFields(); //获取类中所有属性
for (Field f : filedArrays) {
//如果实体属性名和查询返回集中的字段名一致,填充对应的set方法
/*if(fieldName.equals("_id")){
fieldName="id";
}*/
if(f.getName().equals(fieldName)){
//获取到的属性名
f = clzz.getDeclaredField(fieldName);
//属性类型
fieldType = f.getType();
//构造set方法名 setId
String dynamicSetMethod = dynamicMethodName(f.getName(), "set");
//获取方法
m = clzz.getMethod(dynamicSetMethod, fieldType);
//获取到的值
// 如果是 int, float等基本类型,则需要转型
if (fieldType.equals(Integer.TYPE)) {
fieldType = Integer.class;
} else if (fieldType.equals(Float.TYPE)) {
fieldType = Float.class;
} else if (fieldType.equals(Double.TYPE)) {
fieldType = Double.class;
} else if (fieldType.equals(Boolean.TYPE)) {
fieldType = Boolean.class;
} else if (fieldType.equals(Short.TYPE)) {
fieldType = Short.class;
} else if (fieldType.equals(Long.TYPE)) {
fieldType = Long.class;
} else if(fieldType.equals(String.class)){
fieldType = String.class;
}else if(fieldType.equals(Collection.class)){
fieldType = Collection.class;
}
m.invoke(obj, fieldType.cast(document.getFieldValue(fieldName)));
}
}
}
return clzz.cast(obj);
} catch (ClassCastException e) {
// 请检查schema.xml中的各个field的数据类型与PO类的是否一致
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
//请检查PO类中的field对应的各个setter和getter是否存在
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
//请检查schema中的field是否不存在于PO类中
e.printStackTrace();
}
}
return null;
}
//动态构造getXxx setXxx
public static String dynamicMethodName(String name, String setOrGet){
String setMethodName = setOrGet
+ name.substring(0, 1).toUpperCase()
+ name.substring(1);
return setMethodName;
}
SolrDocument与实体类转换
最新推荐文章于 2023-04-04 10:06:03 发布