Deb*_*ndi 3 postgresql spring jpa spring-data-jpa spring-boot
当日期范围有时可能具有空值时,如何根据日期范围选择行(选择所有行)
我有一个名为 Project(id, name, Certification_date); 的表 id 为 int,name 为 varchar(250),certification_date 为时间戳。
那么插入项目时,只插入id和name,但certification_date为空。稍后用户可以验证该项目,然后该行将使用 Certification_date 更新为用户验证项目的日期。因此,在项目表中,我可以有一些行的 Certification_date 为空,有些行带有日期(例如 2020-06-18 00:12:07)
现在我有一个包含名称的搜索查询,并有一个 startDate 和 endDate 过滤器来过滤certification_date。下面是带有完整签名的存储库查询。
@Query(value = "select distinct p.id, p.name, p.certification_date from project p WHERE (LOWER(p.name) LIKE CONCAT('%',LOWER(:searchKey),'%') and ((cast(:startDate as timestamp) is null or p.CERTIFICATION_DATE >= :startDate) AND (cast(:endDate as timestamp) is null or p.CERTIFICATION_DATE < :endDate ))", nativeQuery = true)
public List<Object[]> searchProjects(@Param("searchKey") String searchKey, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
Run Code Online (Sandbox Code Playgroud)
因此,当 searchProjects() 使用所有值执行时,它会正确返回结果。但是当我不需要日期过滤器时,即 startDate 和 endDate 为空时,它会失败。(这里我们对 searchKey 没有任何问题,因为如果 searchKey 为 null,我会传递“”,因此它会返回所有值)
例外是
org.postgresql.util.PSQLException: ERROR: cannot cast type bytea to timestamp without time zone
Run Code Online (Sandbox Code Playgroud)
那么我需要做什么才能使 startDate 和 endDate 可选,以便如果这些日期未通过则返回所有(certification_date 是否为空或有某些值)行?
我也尝试过 Stackoverflow 上的许多解决方案,但它们对我不起作用。
@Query(value = "select distinct p.id, p.name, p.certification_date from project p " +
"where LOWER(p.name) LIKE CONCAT('%',LOWER(:searchKey),'%') " +
"and (cast(cast(:startDate as text) as timestamp) is null or p.CERTIFICATION_DATE >= :startDate) " +
"and (cast(cast(:endDate as text) as timestamp) is null or p.CERTIFICATION_DATE < :endDate)", nativeQuery = true)
public List<Object[]> searchProjects(@Param("searchKey") String searchKey, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7651 次 |
| 最近记录: |