Spring Boot中按日期过滤查询有效行程列表的实现方案
实现方案
你之前查询不符合需求的核心原因是把用户输入的参考日期作为了findByTravelDateAfter的过滤参数,导致只返回了晚于用户输入日期的行程,按以下步骤调整即可:
1. 调整Repository查询方法(可选)
如果不需要把用户输入的参考日期作为行程过滤条件,可在现有Repository中新增以下适配未过期行程查询的方法(也可直接复用现有带TravelDateAfter后缀的方法,只需要调用时传对参数即可):
import java.sql.Date; import java.util.List; @Repository public interface ProposeTravelRepository extends JpaRepository<ProposeTravel, Long> { // 原有方法保留 ProposeTravel findByTravelId(Long travelId); List<ProposeTravel> findByUserId(Long userId); List<ProposeTravel> findByStartCityAndTravelDateAfterAndEndCity(String startCity, Date travelDate, String endCity); List<ProposeTravel> findByStartCityAndTravelDateAndEndCity(String startCity, Date travelDate, String endCity); List<ProposeTravel> findByStartCityAndTravelDateAfter(String startCity, Date travelDate); List<ProposeTravel> findByEndCityAndTravelDateAfter(String endCity, Date travelDate); List<ProposeTravel> findByStartCityAndEndCityAndTravelDateAfter(String startCity, String endCity, Date travelDate); // 新增:仅过滤未过期的所有行程 List<ProposeTravel> findByTravelDateAfter(Date currentDate); }
2. 业务层调用时传入当前系统日期
在Service层调用查询方法时,生成当前日期的java.sql.Date对象作为过滤参数,不需要使用用户输入的参考日期作为日期过滤条件即可:
import java.sql.Date; // 示例业务代码 @Service public class ProposeTravelService { @Autowired private ProposeTravelRepository proposeTravelRepository; public List<ProposeTravel> getValidTravelList(String startCity, String endCity) { // 生成当前系统日期作为未过期过滤的下限 Date currentDate = new Date(System.currentTimeMillis()); // 按需求选择对应的查询方法即可,以下为不同场景示例: // 场景1:查询所有未过期行程 // return proposeTravelRepository.findByTravelDateAfter(currentDate); // 场景2:按出发城市查询未过期行程 // return proposeTravelRepository.findByStartCityAndTravelDateAfter(startCity, currentDate); // 场景3:按出发+到达城市查询未过期行程 return proposeTravelRepository.findByStartCityAndEndCityAndTravelDateAfter(startCity, endCity, currentDate); } }
可选扩展:结合用户输入参考日期过滤
如果后续需求调整为需要同时满足「晚于当前日期」和「晚于用户输入参考日期」,只需要取两个日期的最大值作为过滤参数即可:
Date currentDate = new Date(System.currentTimeMillis()); Date userInputDate = // 从请求参数中获取的用户输入日期 Date filterDate = currentDate.after(userInputDate) ? currentDate : userInputDate; List<ProposeTravel> validTravels = proposeTravelRepository.findByTravelDateAfter(filterDate);
内容的提问来源于stack exchange,提问作者Valero
相关产品推荐
相关产品推荐

