从solr结果集中取数据,取到告终果集,可是结果集是一个map,而我想要获得的是一个对象,怎么处理呢?我前后尝试了三种方式:
java
如下是获取的源数据:json
SolrDocument[{id=25157561, productId=000000000108292291, product={"name":"鸭鸭 2013新潮90绒短款轻薄羽绒服女正品清仓 时尚春秋外套B-360 柠檬黄 170/92A","oldId":"19999729","type":"0","brandId":"000153467","brandName":"鸭鸭","labelPaste":"null","imageCount":5,"firstCategoryId":"361003","secondCategoryId":"161007","thirdCategoryId":"346882","firstCategoryName":"服装鞋帽","secondCategoryName":"女装","thirdCategoryName":"羽绒服","purchaseCategory":"R9001206","id":"000000000108292291","groupId":"284049","color":"柠檬黄","version":"170/92A"}, showOrderFlag=0, userId=6000654740, user={"province":"","birthday":"","constellation":"","id":"6000654740","nickName":"112***1","gender":"","typeId":"1","imageUrl":"http://image.suning.cn/uimg/cmf/cust_headpic/0000000000_01_60x60.jpg","levelId":"161000000020","levelName":"银卡会员"}, storeFlag=0, store={}, againReviewFlag=0, title=, content=骨灰盒江景房, contentLength=6, labels=[], score=1, anonymousFlag=0, bestFlag=0, sort=0, status=0, createDate=Tue Aug 27 17:02:43 CST 2013, publishIp=10.19.95.189, publishDeviceId=1, usefulVoteCount=0, replyCount=0}]
方案一:solrDocument中提供了一个获取每一个field对应值的方法,使用此方法获取全部的field对应的值,set到类中:工具
private List<ReviewFieldDTO> setReviewData(SolrDocumentList list) { List<ReviewFieldDTO> datas = new ArrayList<ReviewFieldDTO>(); String jsonStr = ""; ReviewFieldDTO review = null; for (SolrDocument solrDocument : list) { review = new ReviewFieldDTO(); review.setId((Long)solrDocument.getFieldValue("id")); review.setProduct(solrDocument.getFieldValue("product").toString()); review.setOrderDate((Date)solrDocument.getFieldValue("orderDate")); ... datas.add(review); } return datas; }
这样作的缺点:ui
一、个人类中有20-30个属性,就要须要二三十此,代码至关低级,可读性不好设计
二、若是solr中没有一个field对应的值为空,就会报异常,这样每个solrDocument.getFieldValue方法都要try-catch,我想这样写确定不行,能不能直接将solrDocument变成我要的ReviewFieldDTO类呢,通过代码编写,我使用了第二种方案:code
方案二:我使用了BeanUtils工具+反射,经过反射,获取solrDocument中的全部key和value,而后利用BeanUtils.setProperty(bean, name, value);方法,给ReviewFieldDTO设置属性,这样也有缺点,就是反射过程当中容易出现异常,另外更严重的是此方法对Date类型的属性不能处理,而ReviewFieldDTO中有Date类型的属性,若是非要使用这种方案,就要写date类型的转换类,无疑增长了代码量,我只能放弃这种方案。对象
方案三:这是最后想到的一种方案,由于拿到上面的map值后,感受跟json很像,可是又不是json格式,一直在作的是将map直接转换为对像,忘记了能够使用json做为中间变量,因此方案三大家应该是想到了:get
private List<ReviewFieldDTO> setReviewData(SolrDocumentList list) { List<ReviewFieldDTO> datas = new ArrayList<ReviewFieldDTO>(); String jsonStr = ""; ReviewFieldDTO review = null; for (SolrDocument solrDocument : list) { jsonStr = getJson(solrDocument); review = new ReviewFieldDTO(); review = gson.fromJson(jsonStr, ReviewFieldDTO.class); datas.add(review); } return datas; }
就是先将solrDocument类转换为json,而后再将此json转换为我要的ReviewFieldDTO类,太爽了吧,以前太逗比了吧 ,因此有时候设计思路很重要,不必定非要直接将map转成对象,能够使用中间变量。OK,先这么多吧it
下面一楼一位大哥给的评论太爽了,以前工做都是废的啊,原来solr中提供了将solrDcoument转换为类的API,哎,道行差太远啊。。。io
private List<ReviewFieldDTO> setReviewData(SolrDocumentList list) { DocumentObjectBinder binder = new DocumentObjectBinder(); List<ReviewFieldDTO> reviews = binder.getBeans(ReviewFieldDTO.class, list); return reviews; }
这下好了,感谢那位大拿!!!