Java JPA查询,用于使用Postgres在可选开始日期和结束日期之前、之后和之间进行筛选

Java JPA查询,用于使用Postgres在可选开始日期和结束日期之前、之后和之间进行筛选,java,sql,postgresql,spring-data-jpa,spring-repositories,Java,Sql,Postgresql,Spring Data Jpa,Spring Repositories,我想编写一个JPA存储库查询,它可以使用两个可选的查询参数startDate和endDate来findBy: 起始日期 实际结束 返回 无效的 无效的 全部的 无效的 实际结束 结束前 起始日期 无效的 启动后 起始日期 实际结束 在开始和结束之间 您可以使用以下查询来实现这一点。我可以自由地使用=,但是你当然可以选择,或者两者兼而有之。我们的想法是给你一个功能性的查询 @Query("SELECT m FROM MyObject m WHERE (:beforeDate is nul

我想编写一个JPA存储库查询,它可以使用两个可选的查询参数
startDate
endDate
findBy

起始日期 实际结束 返回 无效的 无效的 全部的 无效的 实际结束 结束前 起始日期 无效的 启动后 起始日期 实际结束 在开始和结束之间
您可以使用以下查询来实现这一点。我可以自由地使用
=
,但是你当然可以选择
,或者两者兼而有之。我们的想法是给你一个功能性的查询

@Query("SELECT m FROM MyObject m WHERE (:beforeDate is null or m.beforeDate >= :beforeDate) and (:afterDate is null or m.afterDate <= :afterDate)")
List<MyObject> findByDateBetween(Date beforeDate, Date afterDate);

@Query(“从MyObject m中选择m,其中(:beforeDate为null或m.beforeDate>=:beforeDate)和(:afterDate为null或m.afterDate这是一个使用4个方法和一个开关的简单解决方案。它很笨重,但可以工作。如果需要实现更复杂的JPQL或SQL查询,这种方法可能会变得特别冗长,因为需要复制4个存储库方法和查询

存储库

@存储库
公共接口MyRepository扩展了JpaRepository{
列表findByDateBetween(日期之前日期,日期之后日期);
在日期之前(日期之前)找到的列表;
列表findByDateAfter(日期afterDate);
列出findAll();
服务

公共列表搜索(日期开始日期、日期结束日期){
int i=(开始日期!=null?1:0)|(结束日期!=null?2:0);
开关(一){
案例0:
返回repository.findAll();
案例1:
返回repository.findByDateAfter(startDate);
案例2:
返回repository.findByDateBefore(endDate);
案例3:
返回repository.findByDateBetween(startDate,endDate);
}
}

(Marc Gravell对开关编码的贡献)

您好,谢谢您的回答!我收到一个错误
PSQLException:错误:无法确定参数$1的数据类型
。我怀疑这是因为我使用了Postgres。我更新了我的问题以反映这一点,因为我忘了提到它。@DV82XL如果改为使用
LocalDate
,它会修复吗?
LocalDate
没有帮助。仅当同时提供了
开始日期
结束日期
时,将
:beforeDate替换为null
,并将(:beforeDate as date)替换为null(参见此)。但是,当任何参数为null时,我会得到
错误:无法将type bytea强制转换为date
。这是因为即使参数为null,JPQL仍会尝试评估日期比较。要确定参数:
@Query(“从MyObject m中选择m,其中(:beforeDate为null或m.beforeDate>=:beforeDate)和(:afterDate为空或m.afterDate@Nguyễ内华达州ền无论是否使用
@Param
,行为都是相同的。JPA/Postgres由于空值而失败。