Spring Data Jpa 分页项影响分页

0tdrvxhp  于 2024-01-09  发布在  Spring
关注(0)|答案(1)|浏览(288)

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

  1. @Service
  2. class UserService(private val userRepository: UserRepository, private val emailService: EmailService) {
  3. fun processInactiveExternalUsersInBatches(pageSize: Int) {
  4. var page = 0
  5. var usersPage: Page<User>
  6. do {
  7. usersPage = userRepository.findUsersByType(userType = UserType.EXTERNAL_USER, PageRequest.of(page, pageSize))
  8. processUsers(usersPage.content)
  9. page++
  10. } while (usersPage.hasNext())
  11. }
  12. private fun processUsers(users: List<User>) {
  13. for (user in users) {
  14. if (!user.active) {
  15. // Send an email to the user about deactivation
  16. emailService.sendDeactivationEmail(user)
  17. // Delete the user using the repository
  18. userRepository.delete(user)
  19. }
  20. }
  21. }
  22. }

字符串

ezykj2lf

ezykj2lf1#

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

  1. @Service
  2. class UserService(private val userRepository: UserRepository, private val
  3. emailService: EmailService) {
  4. fun processInactiveExternalUsersInBatches(pageSize: Int) {
  5. var page = 0
  6. var usersPage: Page<User>
  7. **var deletedUsers = new ArrayList<User>();**
  8. do {
  9. usersPage = userRepository.findUsersByType(userType =
  10. UserType.EXTERNAL_USER, PageRequest.of(page, pageSize))
  11. **var usersToBeDeleted =** processUsers(usersPage.content)
  12. **deletedUsers.addAll(usersToBeDeleted);**
  13. page++
  14. } while (usersPage.hasNext())
  15. **userRepository.deleteAll(deletedUsers);**
  16. }
  17. private **List<User>** fun processUsers(users: List<User>) {
  18. **var deletedUsers = new ArrayList<User>();**
  19. for (user in users) {
  20. if (!user.active) {
  21. // Send an email to the user about deactivation
  22. emailService.sendDeactivationEmail(user)
  23. // find deleted users and return them
  24. **deletedUsers.add(user)**
  25. }
  26. }
  27. **return deletedUsers;**
  28. }
  29. }

字符串

展开查看全部

相关问题