问题描述
我有一个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 (将#修改为@)