英文:
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);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论