我有一个datatest类,它将所有可能的输入参数设置为productdto的列表,这个类还具有来自超类的override方法iterator()。此类具有内联类productiterator。productiterator类中的hasnext方法是从异步作业调用的。因此,每次pagedata.hasnext()false的偏移量和pagesize都会命中查询。i、 当数据不可迭代时。
如果将单个productdto作为查询的输入,则可以直接传递到查询,这样offset和pagesize就可以正常工作。因为我不需要对多个输入进行循环/迭代。但在这里,我必须循环/迭代多个输入(productdto的列表;每个productdto代表查询输入),并对每个输入执行查询,并将结果添加到outputdto列表。所以当我做循环时,我会丢失偏移量和页面大小的记录。
考虑一下这个场景,我将为每个要查询的输入(productdto)获取1000条记录。而且我无法将输入(即productdto列表)组合起来并立即执行。所以对于异步作业,将在productiterator类中调用这个hasnext方法。我可以删除这里的偏移量和页面大小,但这会导致性能问题。
outputdto:是本机查询的结果,我将转换为dto。它有大约12个变量,与productdto不同。
关于如何在我的情况下使用这个偏移量和setmaxresults(pagesize)有什么帮助或建议吗?。
下面是MyDataTest类
public class DataTest implements ProductSrc {
private final List<ProductDto> productDtos;
public DataTest(List<ProductDto> productDtos) {
this.productDtos = productDtos;
}
@Override
public Iterator<HasId<?>> iterator() {
return new ProductIterator(productDtos);
}
private static class ProductIterator implements Iterator<HasId<?>> {
private static final int PAGE_SIZE = 500;
private final List<ProductDto> productDtos;
private Iterator<OutputDto> pageData;
private long offset = 0;
private ProductIterator(List<ProductDto> productDtos) {
this.productDtos = productDtos;
}
@Inject
ProductService productService;
@Override
public boolean hasNext() {
if (!pageData.hasNext()) {
pageData = productService.getPageData(productDtos, offset, PAGE_SIZE).iterator();
offset += PAGE_SIZE;
}
return pageData.hasNext();
}
@Override
public HasId<?> next() {
return pageData.next();
}
}
}
下面是productserviceimpl类
public class ProductServiceImpl implements ProductService{
@Override
public List<OutputDto> getPageData(List<ProductDto> productDtos, long offset, int pageSize) {
List<OutputDto> outputDtos = new ArrayList<>();
if (!productDtos.isEmpty()) {
for (ProductDto dto : productDtos) {
Query query = createNativeQuery("my native select Query with 4 parameters");
query.setParameter(1, dto.getProductType());
query.setParameter(2, dto.getManufacturer());
query.setParameter(3, dto.getVersion());
query.setParameter(4, dto.getUserIds());
// query.setFirstResult((int) offset);
// query.setMaxResults(pageSize);
outputDtos.addAll(toOutputDtoConversion(query.getResultList()));
}
}
return outputDtos;
}
}
这是用于输入参数的productto类。
public class ProductDto {
private String productType;
private String manufacturer;
private String version;
private List<Long> userIds;
public ProductDto(String productType, String manufacturer, String version, List<Long> userIds) {
super();
this.productType = productType;
this.manufacturer = manufacturer;
this.version = version;
this.userIds = userIds;
}
//getters and setters
}
暂无答案!
目前还没有任何答案,快来回答吧!