如何在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文件的属性名?
如何在 C# 中为自定义 DataTemplateSelector 获取 DataTemplate 的 x:DataType