今天作Hbase數據封裝,在將查詢結果Result轉bean的時候使用到了泛型,將T直接添加到list中,發現一直是重複元素,代碼以下:apache
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); }