java - 使用 Spring Boot 按部分发送电子邮件(带分页)?
问题描述
我想通过电子邮件从数据库发送有关用户的信息。
@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;
/getters and setters, etc
}
服务:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getUsersForRequiredDays(int days) {
LocalDate daysAgoDate = LocalDate.now().minusDays(days);
return badUtmMarksRepository.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");
}
}
从 senderService 发送的方法(在上面的 try 块中):
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);
}
解决方案
你的repo
方法应该是:
List<User> findAllWithDateAfter(Pageable pageable, @Param("ago") LocalDate ago);
在调用该方法时,您应该执行以下操作:
@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);
推荐阅读
- c# - 如何获取保留排序顺序的 ICollectionView 的源集合?
- mysql - 可以检索包含替换为序列化数据的外键的 SQL 表吗?
- database - 直接在 RethinkDB 中获取插入的文档
- reactjs - 使用 XLSX.js 和 React 读取文件在 Internet Explorer 11 上得到 TypeMissMatchError
- javascript - 仅当单击多个 div 相互重叠的按钮时才启动 css 动画
- python - 当第一列在工作簿中的名称不同时,如何使用 Python 在单个工作簿中合并多个工作表
- python - Python:如何过滤包含一个字符但不包含多个字符的列
- node.js - 为什么我无法访问我的 Firebase 存储映像?
- django - Django 无法解析导入类型
- c# - 如何使用 c# 中的 memberWiseClone 克隆具有虚拟导航属性的对象