如何在本机查询中将offset和setMaxResultspagesize用于异步处理的多个输入请求

问题描述

我有一个DataTest类,它将所有可能的输入参数设置为ProductDto的列表,并且该类还具有超类的重写方法iterator()。此类具有内联类ProductIterator。 ProductIterator类中的hasNext方法是从异步作业中调用的。 因此,每次使用offset和pagesize的pageData.hasNext()为false时,查询都会命中。即当数据不存在时进行迭代。

如果我将Single ProductDto作为查询的输入,则可以直接传递给查询,以便offset和PageSize可以很好地工作。因为我不需要循环/迭代多个输入。 但是在我的情况下,我必须遍历/迭代多个输入(ProductDto列表;每个ProductDto代表查询输入),并对每个输入执行查询,然后将结果添加到outputDto列表中。因此,当我执行循环时,我将丢失offset和PageSize的记录。

考虑这种情况,对于每个要查询的输入(ProductDto),我都会获得1000条记录。而且我无法合并输入即Productdtos列表并立即执行。 因此,对于异步作业,将在ProductIterator类中调用此hasnext方法。我可以在此处删除offset和pageSize,但这会导致性能问题。

OutputDto:是本机查询的结果,我将转换为dto。这大约有12个变量,与ProductDto不同。

在我的情况下,有关如何使用此偏移量和setMaxResults(pageSize)的任何帮助或建议吗?

下面是My DataTest类

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;
}
}

这是我的ProductDto输入参数类。

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
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)