相关疑难解决方法(0)

Spring数据存储库:列表与流

何时定义方法list以及stream在 Spring 数据存储库中定义什么建议?

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-streaming

例子:

interface UserRepository extends Repository<User, Long> {

  List<User> findAllByLastName(String lastName);

  Stream<User> streamAllByFirstName(String firstName);                    
         
  // Other methods defined.
}
Run Code Online (Sandbox Code Playgroud)

请注意,这里我不是在询问PageSlice - 它们对我来说很清楚,并且我在文档中找到了它们的描述。


我的假设(我错了吗?):

  1. Stream 不会将所有记录加载到 Java 堆中。相反,它将k记录加载到堆中并一一处理它们;然后它加载另一个k记录等等。

  2. List 会立即将所有记录加载到 Java 堆中。

  3. 如果我需要一些后台批处理作业(例如计算分析),我可以使用流操作,因为我不会立即将所有记录加载到堆中。

  4. 如果我需要返回包含所有记录的 REST 响应,我无论如何都需要将它们加载到 RAM 中并将它们序列化为 JSON。在这种情况下,立即加载列表是有意义的。


我看到一些开发人员在返回响应之前将流收集到列表中。

class UserController {

    public ResponseEntity<List<User>> getUsers() {
        return new ResponseEntity(
                repository.streamByFirstName()
                        // OK, for mapper - it is nice syntactic sugar. 
                        // Let's imagine there …
Run Code Online (Sandbox Code Playgroud)

java spring spring-data

19
推荐指数
1
解决办法
3万
查看次数

我是否必须在try-with-resources-block中关闭已终止的流式查询结果?

在Spring Data JPA文档中它说的关于流:

Stream可能会包装底层数据存储特定资源,因此必须在使用后关闭.您可以使用close()方法手动关闭Stream,也可以使用Java 7 try-with-resources块.

请参阅:http://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#repositories.query-streaming

如果我使用forEach,计数或其他终端操作处理流,它应该已经关闭(并且不能再次重复使用),我不必将流包装在额外的try-resources-block中(假设我的块没有'扔任何异常),或者我错在这里?

java java-8 spring-data-jpa java-stream

6
推荐指数
1
解决办法
1180
查看次数