Skip to content

Instantly share code, notes, and snippets.

@mobynote
Created October 10, 2018 01:14
Show Gist options
  • Save mobynote/a129b5befc91f665fa392a9c5a9d49e6 to your computer and use it in GitHub Desktop.
Save mobynote/a129b5befc91f665fa392a9c5a9d49e6 to your computer and use it in GitHub Desktop.
Specification Example
public List<AppResponseVO> findLatestAndSubmittedAppsByAppId() {
return appRequestRepository.findAll(this::buildSpecification).stream()
.map(AppResponseVO::new)
.sorted(Comparator.comparing((AppResponseVO appResponse) -> {
switch (AppLifeCycleStatus.valueOf(appResponse.getStatus())) {
case IN_REVIEW:
return 1;
case ONLINE:
return 2;
case REJECTED:
return 3;
default:
return 9;
}
}).thenComparing(Comparator.comparing(AppResponseVO::getLastUpdatedTime).reversed()))
.collect(Collectors.toList());
}
/*
public List<AppResponseVO> findAppsByOrganizationId(Integer organizationId) {
return appRequestRepository.findAll(this::buildSpecification).stream()
.map(AppResponseVO::new)
.collect(Collectors.toList());
}
*/
private Predicate buildSpecification(Root<AppRequest> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Path<AppRequest.AppRequestStatus> appRequestStatusPath = root.get("status");
Subquery<Long> latestAppSubQuery = query.subquery(Long.class);
Root<AppRequest> subAppRequest = latestAppSubQuery.from(AppRequest.class);
Expression<Long> latestAppModifyTime = cb.greatest(subAppRequest.<Long>get("lastUpdateTime"));
Expression<String> appIdRoot = root.get("appId");
Expression<String> appIdSubApp = subAppRequest.get("appId");
Expression<Long> modifyTimeRoot = root.get("lastUpdateTime");
Predicate appId = cb.equal(appIdRoot, appIdSubApp);
latestAppSubQuery.select(latestAppModifyTime);
latestAppSubQuery.where(appId);
Predicate latestAppQuery = cb.equal(modifyTimeRoot, latestAppSubQuery);
return query
.where(appRequestStatusPath.in(AppRequestStatus.SUBMITTED), latestAppQuery)
//.orderBy(buildOrderCriteria(root, cb))
.getRestriction();
}
private List<Order> buildOrderCriteria(Root<AppRequest> root, CriteriaBuilder cb) {
Path<AppAuditRecord.AppAuditStatus> appAuditStatusPath = root.get("appAuditRecord").get("status");
Path<Long> lastModifiedTime = root.get("lastUpdateTime");
Expression<Integer> statusOrderLevel = cb.<Integer>selectCase()
.when(cb.isNull(appAuditStatusPath), 1)
.when(cb.equal(appAuditStatusPath, AppAuditRecord.AppAuditStatus.CREATED), 1)
.when(cb.equal(appAuditStatusPath, AppAuditRecord.AppAuditStatus.APPROVED), 2)
.when(cb.equal(appAuditStatusPath, AppAuditRecord.AppAuditStatus.REJECTED), 3)
.otherwise(999);
return Arrays.asList(cb.asc(statusOrderLevel), cb.desc(lastModifiedTime));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment