spring-jpa存储库与stream< entity>

vaj7vani  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(421)

我不明白怎么做 Stream<> 返回类型不同于 List<> 对于存储库方法。
我在下面用fetch编写了一个简单的方法 size = 1 ,但我最终得到了表中的所有4条记录,这与列表类似。我错过什么了吗?它是否应该只获取 HINT_FETCH_SIZE . 如果它获取1条记录,那么如何获取其余3条记录?完成了多少个数据库调用?

@QueryHints(value = {
        @QueryHint(name = HINT_FETCH_SIZE, value = "1"),
        @QueryHint(name = HINT_CACHEABLE, value = "false"),
        @QueryHint(name = HINT_READONLY, value = "true"), })
@Query("SELECT s FROM Customer s")
public Stream<Customer> findAllStream8();

服务:

@Transactional(readOnly = true)
public List<Customer> findAllStream(){
    try (Stream<Customer> streamCustomer = repository.findAllStream8()){
        return streamCustomer.collect(Collectors.toList());
    } catch (Exception e){
        e.printStackTrace();
    }
    return Arrays.asList(new Customer("stream customer"));
}

控制器:

@GetMapping("/customer/allStream")
public List<Customer> findAllCustomersStream(){
    return cs.findAllStream();
}
esyap4oy

esyap4oy1#

你的第一个问题在这里得到了很好的回答:https://stackoverflow.com/a/63127616/13210306
关于你的代码 HINT_FETCH_SIZE 用于限制每次迭代中获取的项目数,直到它到达所有项目为止。它将为每个迭代获取1个项目,在您的例子中是4个迭代。
为了限制返回项目的数量,可以使用按名称限制查询(例如:findfirst()或findtop1())。请看这里:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-查询结果
也可以使用 setMaxResults() .

criteria.setMaxResults(1);
ifsvaxew

ifsvaxew2#

巴东文章
spring数据使用特定于提供者的实现来流化结果(hibernate使用scrollableresultset,eclipselink使用scrollablecursor)。它减少了内存消耗和对数据库的查询调用。因此,它也比前面提到的两个解决方案快得多。
检查休眠状态
查询流式处理
调用collect方法后,流将自动关闭,因为如果流不能重用,则没有理由保持底层jdbc resultset处于打开状态
查询流只是为了更好地分配资源和内存而发明的一种新机制。
在下一行的示例中

return streamCustomer.collect(Collectors.toList());

在collect期间,您使它从数据库中读取所有实体并将它们收集到一个列表中。根据您的偏好,我怀疑每次读取1行(1个实体客户)时,它会在数据库中运行4次
如果在流期间您跳过了我在上面发布的hibernate的querystreaming链接中指出的一些元素,那么它就不会从数据库中读取这些元素。
所以如果你有 streamCustomer.skip(2).collect(Collectors.toList()); 它将只从数据库中读取2个元素,并将命中 db2 次。因为您将跳过流中的2个元素,所以不需要将它们带来。
如果你有 streamCustomer.limit(3).collect(Collectors.toList()); 它将从该流中读取3个实体并将它们收集到您的列表中。因此,它会命中数据库3次,每次获取1行(1个客户实体)。
在我看来,这就是如何使用它来更好地分配内存和资源。

相关问题