Spring Data Jpa 分页项影响分页

0tdrvxhp  于 9个月前  发布在  Spring
关注(0)|答案(1)|浏览(175)

我需要在大量的用户(10000K+),并对每个用户的过程中,如检查是否符合我的删除条件的用户逻辑,如果是,然后发送电子邮件,并在数据库中删除用户。
这是我对代码的想法,但我面临着一些问题。如果我删除用户,那么分页会受到影响。我尝试分页总是从0开始,但如果某些用户无法处理,那么我的代码就会陷入无限循环。你能帮助我如何有效地解决这个问题吗?

@Service
class UserService(private val userRepository: UserRepository, private val emailService: EmailService) {

    fun processInactiveExternalUsersInBatches(pageSize: Int) {
        var page = 0
        var usersPage: Page<User>

        do {
            usersPage = userRepository.findUsersByType(userType = UserType.EXTERNAL_USER, PageRequest.of(page, pageSize))
            processUsers(usersPage.content)

            page++
        } while (usersPage.hasNext())
    }

    private fun processUsers(users: List<User>) {
        for (user in users) {
            if (!user.active) {
                // Send an email to the user about deactivation
                emailService.sendDeactivationEmail(user)

                // Delete the user using the repository
                userRepository.delete(user)
            }
        }
    }
}

字符串

ezykj2lf

ezykj2lf1#

你可以获取用户(你可以只找到非活动用户以获得更好的性能),并向将要删除的用户发送电子邮件,然后执行jpql查询来删除这些用户。
另一个解决方案:你可以处理用户并向他们发送电子邮件,但不能删除他们,然后你可以将他们存储在一个列表中,并在processInactiveExternalUsersInBatches的末尾删除他们。请注意,我在java中修改了你的代码,但我希望你得到这样的解决方案:

@Service
    class UserService(private val userRepository: UserRepository, private val 
    emailService: EmailService) {

    fun processInactiveExternalUsersInBatches(pageSize: Int) {
        var page = 0
        var usersPage: Page<User>

        **var deletedUsers = new ArrayList<User>();**

        do {
            usersPage = userRepository.findUsersByType(userType = 
            UserType.EXTERNAL_USER, PageRequest.of(page, pageSize))
            **var usersToBeDeleted =** processUsers(usersPage.content)
        
            **deletedUsers.addAll(usersToBeDeleted);**

            page++
        } while (usersPage.hasNext())

        **userRepository.deleteAll(deletedUsers);**
    }

    private **List<User>** fun processUsers(users: List<User>) {
        **var deletedUsers = new ArrayList<User>();**
        for (user in users) {
            if (!user.active) {
                // Send an email to the user about deactivation
                emailService.sendDeactivationEmail(user)

                // find deleted users and return them
                **deletedUsers.add(user)**
            }
        }
        **return deletedUsers;**
    }
}

字符串

相关问题