使用谓词进行日期过滤的条件查询
Criteria Query for Date Filtering with Predicates
我正在尝试根据属性过滤 AudtiTrial(实体 class)列表。我正在为我的 class 使用 Criteria Builder
,名为 Audit.java,具有以下属性。
@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
class 使用 criteriaQuery,即下面的 Audit.java 是代码。在服务 class 中用于基于 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;
}
我正在从我的控制器 class 调用服务,它接受 RequestParameters 作为模块、区域和创建日期。依次调用服务和 returns 过滤数据。
@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]
但上述给定日期的条目存在于 Database.So 过滤未按预期进行。
我哪里错了请帮忙?
所以它基本上应该忽略 url 中传递的值的时间部分 (T12:27:38.000+0000)
并且应该只将日期 2019-06-11
与数据库中存在的数据进行比较。任何帮助如何实现它?
欢迎任何建议和更正。提前致谢。
问题似乎出在您的控制器方法的签名中。你有 @DateTimeFormat(pattern="yyyy-MM-dd") Date createdDate
。因此它基本上忽略了您在 url.
中传递的值 (T12:27:38.000+0000
) 的时间部分
您可以像下面那样尝试'DateTimeFormat.ISO.DATE_TIME'。
@DateTimeFormat(iso ="DateTimeFormat.ISO.DATE_TIME") Date createdDate
我正在尝试根据属性过滤 AudtiTrial(实体 class)列表。我正在为我的 class 使用 Criteria Builder
,名为 Audit.java,具有以下属性。
@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
class 使用 criteriaQuery,即下面的 Audit.java 是代码。在服务 class 中用于基于 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;
}
我正在从我的控制器 class 调用服务,它接受 RequestParameters 作为模块、区域和创建日期。依次调用服务和 returns 过滤数据。
@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]
但上述给定日期的条目存在于 Database.So 过滤未按预期进行。
我哪里错了请帮忙?
所以它基本上应该忽略 url 中传递的值的时间部分 (T12:27:38.000+0000)
并且应该只将日期 2019-06-11
与数据库中存在的数据进行比较。任何帮助如何实现它?
欢迎任何建议和更正。提前致谢。
问题似乎出在您的控制器方法的签名中。你有 @DateTimeFormat(pattern="yyyy-MM-dd") Date createdDate
。因此它基本上忽略了您在 url.
T12:27:38.000+0000
) 的时间部分
您可以像下面那样尝试'DateTimeFormat.ISO.DATE_TIME'。
@DateTimeFormat(iso ="DateTimeFormat.ISO.DATE_TIME") Date createdDate