如何在spring data jpa中为自定义采石场提供可变参数而不使用for循环

Posted

技术标签:

【中文标题】如何在spring data jpa中为自定义采石场提供可变参数而不使用for循环【英文标题】:How to provide variable parameters for custom quarries in spring data jpa and not use for loop 【发布时间】:2019-11-27 00:05:11 【问题描述】:

我有两个数据库,我必须根据第一个数据库的范围(从和到)搜索产品列表,但问题是范围的数量未知。

目前,我从第一个 DB 获得范围列表(从和到)。然后使用 for 循环查询第二个数据库。

    //1st getting list of ranges
List<Ranges> ranges = this.productRepository.getRangeFromAndTo();

//query to get ranges
@Query(value = "SELECT * FROM PRODUCT_RANGE WHERE  productId = ?1 AND goodToUse = ?2 AND CHECKOUT is null", nativeQuery=true)
List<Range> getRangeFromAndTo(String productId, String goodToUse);

//using for loop to query 2nd db
ranges.forEach(range -> productService.countProducts(range.getRangeFrom(),fnnRange.getRangeTo()););

//this is the query
@Query(value="select Count(*) from RESOURCE where RESOURCE_VALUE between ?1 and ?2 and upper(RESOURCE_STATUS)=upper('available')", nativeQuery=true)
Long countByresourceValueBetween(String fnnRangeFrom, String fnnRangeTo);

我想一次性查询第二个数据库以减少时间。

【问题讨论】:

所以你想并行执行这两种方法? 【参考方案1】:

因为您事先不知道您有多少范围,所以我认为最好的方法是将所有查询并行发送到第二个数据库,例如,将每个调用包装在 CompletableFuture 中,然后组合所有他们进入一个未来以获得最终结果。 这样,您只需等待较慢的查询,而不是等待所有查询的总和。

这里是一个如何将可完成期货列表转换为列表的可完成期货的示例。 List<Future> to Future<List> sequence

当查询完成时,如果您查看所有可以使用的元素的总和

result.stream().mapToLong(it->it).sum();

【讨论】:

以上是关于如何在spring data jpa中为自定义采石场提供可变参数而不使用for循环的主要内容,如果未能解决你的问题,请参考以下文章

是否有办法在春季为自定义依赖项找出application.properties文件的属性名?

Spring Data JPA:嵌套实体的批量插入

如何在 Spring Data JPA 排序中定义空处理?

如何在 C# 中为自定义 DataTemplateSelector 获取 DataTemplate 的 x:DataType

如何在 WooCommerce 中为自定义产品数据选项卡定义图标

如何在 JavaScript 中为自定义对象创建方法?