英文:
Sending email with Spring Boot by parts (with pagination)?
问题
我想通过电子邮件发送来自数据库的用户信息。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Query(value = "SELECT user from User user where user.reportDate >= :ago order by user.reportDate desc")
    List<User> findAllWithDateAfter(@Param("ago") LocalDate ago);
}
经典的用户实体:
@Entity
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String name;
    // 获取器和设置器等等
}
服务:
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    public List<User> getUsersForRequiredDays(int days) {
        LocalDate daysAgoDate = LocalDate.now().minusDays(days);
        return userRepository.findAllWithDateAfter(daysAgoDate);
    }
}
但我想限制此查询。如果从此查询中检索超过30行,我想将其分成几部分。而不是发送包含100行的一封电子邮件,我想发送四封电子邮件(30/30/30/10)。我听说过分页,但我不知道如何应用它到邮件。
我按计划发送电子邮件:
public class ScheduledMailSenderService {
    private final MailSenderService mailSender;
    @Scheduled(cron = "${schedule.cron.update}")
    public void send() {
        log.info("Scheduled sending started");
        try {
            mailSender.send();
        } catch (MessagingException | IOException | TemplateException e) {
            log.error("Error occurred while sending email message:: {}", e.toString());
        }
        log.info("Scheduled sending finished");
    }
}
发送者服务中的 send 方法(在上面的 try 块中):
public void send() throws MessagingException, IOException, TemplateException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        List<User> users = userService.getUsersForRequiredDays(interval); //在这里使用来自数据库的信息
        setMimeMessageSettings(mimeMessage, subject, emailTo, reportTable, from);
        mailSender.send(mimeMessage);
    }
英文:
I want to send infomation about users from database through email.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Query(value = "SELECT user from User user where user.reportDate >= :ago order by user.reportDate desc")
    List<User> findAllWithDateAfter(@Param("ago") LocalDate ago);
}
Classic User entity:
@Entity
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String name;
    /getters and setters, etc
}
Service:
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    public List<User> getUsersForRequiredDays(int days) {
        LocalDate daysAgoDate = LocalDate.now().minusDays(days);
        return badUtmMarksRepository.findAllWithDateAfter(daysAgoDate);
    }
}
But I want to limit this query. If i'll retrieve more than 30 rows from this query, I want to divide it into parts. Instead of sending one email with 100 rows, I want to send four emails (30/30/30/10). I heard about pagination, but I don't know how to apply it for mail.
I'm sending emails on schedule:
public class ScheduledMailSenderService {
    private final MailSenderService mailSender;
    @Scheduled(cron = "${schedule.cron.update}")
    public void send() {
        log.info("Scheduled sending started");
        try {
            mailSender.send();
        } catch (MessagingException | IOException | TemplateException e) {
            log.error("Error occurred while sending email message:: {}", e.toString());
        }
        log.info("Scheduled sending finished");
    }
}
Method send from senderService (in try block above):
public void send() throws MessagingException, IOException, TemplateException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        List<User> users = userService.getUsersForRequiredDays(interval); //im using info from db here
        setMimeMessageSettings(mimeMessage, subject, emailTo, reportTable, from);
        mailSender.send(mimeMessage);
    }
答案1
得分: 1
你的 repo 方法应该是:
List<User> findAllWithDateAfter(Pageable pageable, @Param("ago") LocalDate ago);
在调用该方法时,你应该像这样做:
@Autowired
UserRepository userRepository;
// ...
int size;
int index;
*** 填充 size 和 index 变量 ***
PageRequest pageRequest = PageRequest.of(index, size);
userRepository.findAllWithDateAfter(pageRequest, your-other-parameter);
英文:
Your repo method should be:
List<User> findAllWithDateAfter(Pageable pageable, @Param("ago") LocalDate ago);
and when calling the method you should do something like :
@Autowired
UserRepository userRepository; 
...
int size;
int index;
*** fill the size and index variables ***
PageRequest pageRequest = PageRequest.of(index, size);
userRepository.findAllWithDateAfter(pageRequest, your-other-parameter);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论