spring 从数据库中查询有限项

jyztefdp  于 2023-04-28  发布在  Spring
关注(0)|答案(2)|浏览(270)

我正在开发一个Spring应用程序,我需要更新数据库中的每个用户(大约4500条记录)。
我的代码在只有少数用户的本地环境中运行得很好,但我担心在测试环境中,甚至在实时环境中,如果我从数据库中获取每个用户,代码会非常慢。
以下是我目前为止的代码:

public void syncUsers() {
        List<User> usersList = userService.getAllUsers();
        usersList.stream().forEach((user) -> {
            if (isNull(user.getSocialId())) {
                String id = socialRestAPIService.syncContacts(user);
                user.setSocialId(id);
                userService.updateUser(user);
            }
        });
    }

这是userService.getAllUsers方法:

public List<User> getAllUsers () {
        return userRepository.findAll();
    }

我想实现的是一次更新100个用户,然后再更新下一个100个用户。这怎么可能

ivqmmu1c

ivqmmu1c1#

如果userRepository是一个JpaRepository,那么它实现了PagingAndSortingRepository,它有一个方法findAll(可分页)。
因此,您可以创建一个Pageable,如下所示:

Pageable.ofSize(100).withPage(10)
pkmbmrz7

pkmbmrz72#

你可以使用pagable和while循环按限制获取所有数据,直到获取所有数据。例如:

public void syncUsers() {
    int pageSize = 100;
    Pageable pageable = PageRequest.of(0, pageSize, Sort.by("id"));

    Page<User> userPage;
    do {
        userPage = userService.getAllUsers(pageable);
        List<User> usersList = userPage.getContent();

        usersList.stream().forEach((user) -> {
            if (isNull(user.getSocialId())) {
                String id = socialRestAPIService.syncContacts(user);
                user.setSocialId(id);
                userService.updateUser(user);
            }
        });

        pageable = pageable.next();
    } while (userPage.hasNext());
}

相关问题