通过 Spring JPA Repository 获取最近 3 天的记录

hsa*_*dik 0 spring spring-data-jpa

我有一个包含 field 的实体date

@Entity
@Table(name="messages", schema = "users")
...
public class Message {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "author")
    private String author;

    @Column(name = "tags")
    private String tags;

    @Column(name = "message_date")
    private LocalDate date;

    @Override
    public String toString() {
       ...    
    }
}
Run Code Online (Sandbox Code Playgroud)
@Repository
public interface MessageRepository extends JpaRepository<Message, Long> {

    Message findByMessageId(Long id);

}
Run Code Online (Sandbox Code Playgroud)

我正在将 Spring Data JPA 与存储库一起使用。我想从数据库获取过去 3 天的所有消息(字段date)。我怎样才能用 Spring JPA 做到这一点?

@Query(...?)
List<Message> findBy...?
Run Code Online (Sandbox Code Playgroud)

mom*_*omo 7

我建议将逻辑与实际查询分开。服务可以处理所有中间事物,例如:

@Service
public class MessageService {
    private final MessageRepository repository;

    @Autowired
    public MessageService(MessageRepository repository) {
        this.repository = repository;
    }

    List<Message> getLastThreeDays() {
        // subtract 3 days from today
        LocalDate threeDaysAgoDate = LocalDate.now().minusDays(3);
        return this.repository.findAllWithDateAfter(threeDaysAgoDate);

    }
}
Run Code Online (Sandbox Code Playgroud)

并且您的存储库保持干净整洁:

@Repository
public interface MessageRepository extends JpaRepository<Message, Long> {

    Optional<Message> findByMessageId(Long id);

    @Query("select m from Message m where date >= :threeDaysAgoDate")
    List<Message> findAllWithDateAfter(@Param("threeDaysAgoDate") LocalDate threeDaysAgoDate);

}
Run Code Online (Sandbox Code Playgroud)