我正在尝试根据属性过滤 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 类使用 criteriaQuery,即下面的 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; 
} 

我从我的 Controller 类调用服务,它接受 RequestParameters 作为模块、区域和创建日期。反过来调用服务并返回过滤后的数据。

@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); 
 
    } 

使用的日期格式化程序是

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

The Data stored in Postgresql is Timestamp with timezone. and it's in format of

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

日志显示如下内容

binding parameter [1] as [TIMESTAMP] - [Tue Jun 11 00:00:00 IST 2019]

但数据库中存在上述给定日期的条目。因此过滤未按预期进行。 我哪里错了请帮忙? 所以它基本上应该忽略在 url 中传递的值的时间部分 (T12:27:38.000+0000) 并且应该只比较日期 2019-06-11 与数据库中存在的数据。任何帮助如何实现它?

欢迎任何建议和更正。提前致谢。

请您参考如下方法:

问题似乎出在您的 Controller 方法的签名中。您有 @DateTimeFormat(pattern="yyyy-MM-dd") 日期创建日期。因此,它基本上会忽略您在 url 中传递的值 (T12:27:38.000+0000) 的时间部分。

您可以像下面这样尝试“DateTimeFormat.ISO.DATE_TIME”。

@DateTimeFormat(iso ="DateTimeFormat.ISO.DATE_TIME") Date  createdDate 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!