# Fabric链码查询数据库工具类
[TOC]
## QueryUtil
```
package com.yl.crm.common.utils;
import com.alibaba.fastjson.JSON;
import com.yl.crm.common.result.ListResult;
import com.yl.crm.common.result.PageResult;
import com.yl.crm.demand.entity.Demand;
import lombok.extern.java.Log;
import org.apache.commons.collections4.IterableUtils;
import org.hyperledger.fabric.shim.ChaincodeException;
import org.hyperledger.fabric.shim.ChaincodeStub;
import org.hyperledger.fabric.shim.ledger.KeyModification;
import org.hyperledger.fabric.shim.ledger.KeyValue;
import org.hyperledger.fabric.shim.ledger.QueryResultsIterator;
import org.hyperledger.fabric.shim.ledger.QueryResultsIteratorWithMetadata;
import java.util.ArrayList;
import java.util.List;
/**
* ListUtil
*
* @author wangxiaohu
* @date 2022-11-10 11:27
*/
@Log
public class QueryUtil<T> {
/**
* 查询列表
*
* @param stub stub
* @param query query
* @param type type
* @return ListResult<T>
*/
public ListResult<T> queryList(ChaincodeStub stub, String query, Class<T> type) {
log.info(String.format("列表查询 , 入参 = %s", query));
ListResult<T> resultList = new ListResult<>();
QueryResultsIterator<KeyValue> queryResult = stub.getQueryResult(query);
List<T> results = new ArrayList<>();
if (!IterableUtils.isEmpty(queryResult)) {
for (KeyValue kv : queryResult) {
results.add(JSON.parseObject(kv.getStringValue(), type));
}
resultList.setData(results);
}
log.info(String.format("列表查询,入参 = %s,返回结果=%s", query, JSON.toJSONString(resultList)));
return resultList;
}
/**
* 分页查询
*
* @param stub stub
* @param query query
* @param pageSize pageSize
* @param bookmark bookmark
* @return PageResult<T>
*/
public PageResult<T> pagedQuery(ChaincodeStub stub, String query, int pageSize, String bookmark, , Class<T> type) {
log.info(String.format("分页查询 , query = %s", query));
QueryResultsIteratorWithMetadata<KeyValue> queryResult = stub.getQueryResultWithPagination(query,
pageSize,
bookmark);
List<T> list = new ArrayList<>();
if (!IterableUtils.isEmpty(queryResult)) {
for (KeyValue kv : queryResult) {
list.add(JSON.parseObject(kv.getValue(), type));
}
}
PageResult<T> pageResult = new PageResult<T>()
.setData(list)
.setBookmark(queryResult.getMetadata().getBookmark());
log.info(String.format("分页查询入参=%s,返回结果=%s", query, JSON.toJSONString(pageResult)));
return pageResult;
}
/**
* 查询账本历史记录
*
* @param stub stub
* @param id id
* @return String
*/
public String queryHistoryForId(ChaincodeStub stub, String id) {
log.info(String.format("queryHistoryForId , id = %s", id));
try {
QueryResultsIterator<KeyModification> history = stub.getHistoryForKey(id);
List<KeyModification> list = new ArrayList<>();
history.forEach(list::add);
String result = JSON.toJSONString(list);
log.info("getClientHistoryForId-->入参:" + id + ",查询结果:" + list);
return result;
} catch (Exception e) {
throw new ChaincodeException("历史记录查询错误");
}
}
}
```
## ListResult
```
package com.yl.crm.common.result;
import lombok.Data;
import org.hyperledger.fabric.contract.annotation.DataType;
import org.hyperledger.fabric.contract.annotation.Property;
import java.util.List;
@DataType
@Data
public class ListResult<T> {
@Property
List<T> data;
}
```
## PageResult
```
package com.yl.crm.common.result;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hyperledger.fabric.contract.annotation.DataType;
import org.hyperledger.fabric.contract.annotation.Property;
import java.util.List;
@DataType
@Data
@Accessors(chain = true)
public class PageResult<T> {
@Property
String bookmark;
@Property
List<T> data;
}
```