Postgres+Spring Boot查询7天内到期证书报错求助
解决Postgres + Spring Boot 查询7天内到期证书的报错
错误原因分析
- 泛型不匹配:
JpaSpecificationExecutor的泛型参数应为Certificado,而非Endereco,否则会导致类型兼容问题。 - 实体类名错误:JPQL语句中引用的实体类名要和代码中的
Certificado一致,不能写成Certificate。 - JPQL语法限制:JPQL是跨数据库的标准查询语言,不支持Postgres专属的
INTERVAL '7' DAY写法,需改用JPA标准函数或原生查询。
修正方案一:使用JPA标准JPQL查询
兼容所有JPA支持的数据库,代码如下:
public interface CertificadoRepository extends JpaRepository<Certificado, Long>, JpaSpecificationExecutor<Certificado> { // 查询7天内到期的数字证书 @Query(value = "SELECT c " + " FROM Certificado c " + " WHERE c.dtValidade BETWEEN CURRENT_DATE AND DATEADD('DAY', 7, CURRENT_DATE)") List<Certificado> findCertificadosVencidos(); }
修正方案二:使用Postgres原生查询
如果需要使用Postgres特有的日期语法,添加nativeQuery=true标识:
public interface CertificadoRepository extends JpaRepository<Certificado, Long>, JpaSpecificationExecutor<Certificado> { // 查询7天内到期的数字证书(Postgres原生查询) @Query(value = "SELECT * " + " FROM certificado c " + " WHERE c.dt_valididade BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL '7 days'", nativeQuery = true) List<Certificado> findCertificadosVencidos(); }
额外注意事项
- 确认实体类
Certificado的dtValidade字段,与数据库表certificado的dt_valididade列(或实际列名)映射正确。 CURRENT_DATE在JPQL和Postgres中均表示当前日期,无需加括号调用。
内容的提问来源于stack exchange,提问作者José Henrique Queiroz
相关产品推荐
相关产品推荐

