使用谓词进行日期过滤的条件查询

时间:2019-07-15 18:07:43

标签: postgresql spring-boot jpa hibernate-criteria

我正在尝试根据属性过滤AudtiTrial(实体类)的列表。我在名为Audit.java的类中使用Criteria Builder,具有以下属性。

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

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

  @Column(name = "created_date", columnDefinition = "timestamp with time zone")
  @Temporal(TemporalType.TIMESTAMP)
  private Date createdDate;

之后,对Root类使用criteriasQuery,即下面的Audit.java是代码。服务类中基于Predicates进行过滤。

CriteriaQuery<AuditTrail> criteriaQuery = cb.createQuery(AuditTrail.class);
    Root<AuditTrail> from = criteriaQuery.from(AuditTrail.class);

    List<Predicate> predicateList = getFilterPRedicates(cb, from, auditTrial);

    Predicate[] activePredicates = predicateList.toArray(new Predicate[predicateList.size()]);
    Predicate filter = cb.and(activePredicates);

    criteriaQuery.where(filter);

    CriteriaQuery<AuditTrail> select = criteriaQuery.select(from);

    return entityManager.createQuery(select).getResultList();

和我的辅助函数 getFilterPRedicates 如下

public List<Predicates> getFilterPRedicates(AuditTrial auditTrial){
    if (auditTrial.getModifiedDate() != null && !auditTrial.getModifiedDate().toString().equals("")) {
          Predicate modifieddate = cb.equal(from.<Date>get("modifiedDate"), auditTrial.getModifiedDate());
          predicateList.add(modifieddate);
        }
return predicateList;
}

我正在从我的控制器类中调用服务,该控制器类接受RequestParameters作为Module,Region和createdDate。依次调用服务并返回过滤的数据。

@GetMapping("/audit/filters")
  public AuditResponseObject getAudits(
      @RequestParam(value = "modifieddate", required = false, defaultValue = "")@DateTimeFormat(pattern="yyyy-MM-dd") Date  createdDate,
      @RequestParam(value = "module", required = false, defaultValue = "") String module,
      @RequestParam(value = "region", required = false, defaultValue = "") String region)
      {
       AuditTrail auditInfo = new AuditTrail();
     if (createddate != null && !createddate.toString().equals("")) {
      auditInfo.setCreatedDate(formatter.parse(formatter.format(createddate)));
    }
    auditInfo.setModule(module);
    auditInfo.setRegion(region);
    List<AuditTrail> auditList = auditTrailService.findByFilters(auditInfo);

    }

使用的dateformatter是

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss aa");
  

Postgresql中存储的数据是带有时区的时间戳。   格式为

     

2019-06-11 17:57:38+05:30

过滤对于区域和模块工作正常,但不适用于createdDate。 当我尝试使用createddate = 2019-06-11T12:27:38.000+0000来访问API时 即CURL在下面 localhost:8080/api/audit/filters?createddate=2019-06-11T12%3A27%3A38.000%2B0000

日志显示如下内容

  

将参数[1]绑定为[TIMESTAMP]-[Tue Jun 11 00:00:00 IST 2019]

,但是数据库中存在上述给定日期的条目。因此,未按预期进行过滤。 我错了,请帮忙吗? 因此,它应该大胆地忽略URL中传递的(T12:27:38.000+0000)值的时间部分,而应仅将日期2019-06-11与数据库中存在的数据进行比较。任何帮助该如何实现?

欢迎提出任何建议和更正。预先感谢。

1 个答案:

答案 0 :(得分:1)

问题似乎出在您的控制器方法的签名中。您有@DateTimeFormat(pattern="yyyy-MM-dd") Date createdDate。因此,它会大声地忽略您在网址中传递的值(T12:27:38.000+0000)的时间部分。

您可以尝试使用“ DateTimeFormat.ISO.DATE_TIME”,如下所示。

@DateTimeFormat(iso ="DateTimeFormat.ISO.DATE_TIME") Date  createdDate
相关问题