SolrDocument与实体类转换

来源:互联网 发布:java中连续声明变量 编辑:程序博客网 时间:2024/06/09 16:09
/**     *      * 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 setXxxpublic static String dynamicMethodName(String name, String setOrGet){         String setMethodName = setOrGet                   + name.substring(0, 1).toUpperCase()                    + name.substring(1);   return setMethodName;    }