前言:
今天做Hbase数据封装,在将查询结果Result转bean的时候使用到了泛型,将T直接添加到list中,发现一直是重复元素,代码如下:
public <T> List<T> queryScan(T obj, Map<String, String> param){
List<T> objs = new ArrayList<T>();
try {
String tableName = getORMTable(obj);
if (StringUtils.isBlank(tableName)) {
return null;
}
Table table = HconnectionFactory.connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
for (Map.Entry<String, String> entry : param.entrySet()){
Filter filter = new SingleColumnValueFilter(Bytes.toBytes(entry.getKey()), null, CompareFilter.CompareOp.EQUAL, Bytes.toBytes(entry.getValue()));
scan.setFilter(filter);
}
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
T bean = HBaseBeanUtil.resultToBean(result, obj);
objs.add(bean);
}
} catch (Exception e) {
e.printStackTrace();
}
return objs;
}
解决方法:
因为泛型不能初始化,也不能clone,所以需要用到apache的bean工具包BeanUtils,用来做对象clone,然后再添加到list就没有问题了。关键代码如下:
for (Result result : scanner) {
T beanClone = (T)BeanUtils.cloneBean(HBaseBeanUtil.resultToBean(result, obj));
objs.add(beanClone);
}