我想显示一个 2D 图表,其中包含给定时间跨度内处理的对象数量(映射在 JPA 中)。在 30 分钟的时间内,这个数量可以扩展到大约 30k 个对象。
作为一名 DBMS,我在 4.2.21 版中使用 PostgreSQL 9.4 和 JPA 2.0 以及 Hibernate。
目前,我正在使用这段代码,以便将金额添加到我的临时“桶”中。
// Get all objects after a given start date
List<MyObject> myObjects= myJPADbService.getMyObjects(Date.from(startDate.atZone
(ZoneId.systemDefault()).toInstant()), Integer.MAX_VALUE);
for (MyObject information : myObjects) {
LocalDateTime pageDate = LocalDateTime.ofInstant(Instant.ofEpochMilli(information.getLastSeen().getTime()), ZoneId.systemDefault());
long duration;
if (temporalUnit == ChronoUnit.MINUTES) {
duration = Duration.between(startDate, pageDate).toMinutes();
} else if (temporalUnit == ChronoUnit.DAYS) {
duration = Duration.between(startDate, pageDate).toDays();
} else {
duration = Duration.between(startDate, pageDate).toHours();
}
pagesPerUnit[(int) (Math.abs(duration))]++;
}
然而,根据用户选择的时间跨度,这段代码可能效率非常低。如果 DBMS 根据用户选择的时间跨度计算存储桶,可能会更有效。
如何用正确的 JPQL 语法来表达这一点?
首先,您需要一种 JPA 方式来计算之间的差异startDate
and pageDate
在各自的单元中,这有点难以制定,因为它非常依赖于数据库。最后,您将需要一些自定义函数或编写非常复杂的 JPQL 查询。
在 PostgreSQL 中计算两个日期之间的天数就像这样做一样简单date_part('day', t2 - t1)
。对于您已经需要的时间date_part('day', t2 - t1) * 24 + date_part('hour', t2 - t1)
和分钟date_part('day', t2 - t1) * 24 * 60 + date_part('hour', t2 - t1) * 60 + date_part('minute', t2 - t1)
.
为了在 JPQL 中使用这些数据库函数,您可以使用FUNCTION
语法类似FUNCTION('date_part', 'day', :startDate - pageDate)
.
最后,您将按这样的表达式进行分组并按 id 进行计数,如下所示
SELECT COUNT(o.id)
FROM MyObject o
GROUP BY FUNCTION('date_part', 'day', :startDate - o.pageDate)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)