如何在本机查询中使用offset和setmaxresults(pagesize)来处理异步进程的多个输入请求

qhhrdooz  于 2021-07-05  发布在  Java
关注(0)|答案(0)|浏览(206)

我有一个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
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题