我想做的是,计算符合键入条件的行数(我需要警告用户查找将花费一些时间
x rows * (estimated time for one row)
,我的代码如下所示:
CriteriaBuilder qb = em.getCriteriaBuilder();
CriteriaQuery<Long> criteria = qb.createQuery(Long.class);
Root<TrackingDAO> p = criteria.from(TrackingDAO.class);
criteria.select(qb.count(criteria
.from(TrackingDAO.class)));
/* my stuff with criteria */
TypedQuery<Long> q = em.createQuery(criteria);
setCounterOfLookUpResults(q.getSingleResult());
课程运行良好,在我得到结果之前,它们完全很奇怪,例如
56432
,我期待例如430
。
有人可以告诉我,如何 ping 数据库并询问,在我获取这些行之前它将为我提供多少行?
使用
Projections
根据条件获取行数
criteria.setProjection(Projections.rowCount());
return Integer.parseInt(criteria.list().get(0).toString());
或
criteria.select(qb.count(p.get(TrackingDAO_.id)));
在我的例子中,All 看起来像 count 方法返回执行代码期间的每一个操作,我假设这样的数字:当查询返回 430 个结果时为 6949360,当我有 1 个结果时“仅”1131
大多数数据库在您根据 WHERE 子句请求之前并不知道您要请求什么。 因此,最通用的方法是编写一个方法,该方法接受您的表和 where 子句,并对它执行 count(*) 并告诉您有多少行与您的查询匹配。
您可以使用投影来获取行数
criteria.setProjection(Projections.rowCount());
int count = Integer.valueOf(criteria.uniqueResult());