带有计数和 where 谓词的 Hibernate JPA CriteriaQuery
Hibernate JPA CriteriaQuery with count and where predicate
我正在尝试使用 CriteriaQuery 在 JPA/Hibernate 中复制此查询的结果。
select count(*) from tbl_survey where CREATED_DATE > to_date('2020-04-01', 'yyyy-mm-dd')
daysBack 值作为参数传入。
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, daysBack);
Date daysAgo = cal.getTime();
try {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<Survey> root = cq.from(Survey.class);
Path<Date> dateCreated = root.<Date>get("createdDate");
Predicate datePredicate = cb.greaterThanOrEqualTo(dateCreated, daysAgo);
cq.where(datePredicate);
cq.select(cb.count(cq.from(Survey.class)));
long count = entityManager.createQuery(cq).getSingleResult();
JSONObject resultJson = new JSONObject();
resultJson.put(SURVEY_COUNT, count);
logger.info("Count for Survey table is: {}", count);
return new ResponseEntity<>(resultJson.toString(), HttpStatus.OK);
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
return new ResponseEntity(e.getLocalizedMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
日志输出为:
调查计数 table 是:36
但是 table 中只有 6 行,这对我来说表明正在生成某种自连接或叉积来创建 36 的输出。我应该做些什么不同的事情来获得正确计数?
使用新根的这一行出现自加入
cq.select(cb.count(cq.from(Survey.class)));
root用于where条件和count查询不同导致自连接。对计数查询也使用相同的根
cq.select(cb.count(root));
我正在尝试使用 CriteriaQuery 在 JPA/Hibernate 中复制此查询的结果。
select count(*) from tbl_survey where CREATED_DATE > to_date('2020-04-01', 'yyyy-mm-dd')
daysBack 值作为参数传入。
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, daysBack);
Date daysAgo = cal.getTime();
try {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<Survey> root = cq.from(Survey.class);
Path<Date> dateCreated = root.<Date>get("createdDate");
Predicate datePredicate = cb.greaterThanOrEqualTo(dateCreated, daysAgo);
cq.where(datePredicate);
cq.select(cb.count(cq.from(Survey.class)));
long count = entityManager.createQuery(cq).getSingleResult();
JSONObject resultJson = new JSONObject();
resultJson.put(SURVEY_COUNT, count);
logger.info("Count for Survey table is: {}", count);
return new ResponseEntity<>(resultJson.toString(), HttpStatus.OK);
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
return new ResponseEntity(e.getLocalizedMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
日志输出为: 调查计数 table 是:36
但是 table 中只有 6 行,这对我来说表明正在生成某种自连接或叉积来创建 36 的输出。我应该做些什么不同的事情来获得正确计数?
使用新根的这一行出现自加入
cq.select(cb.count(cq.from(Survey.class)));
root用于where条件和count查询不同导致自连接。对计数查询也使用相同的根
cq.select(cb.count(root));