我正在使用 CriteriaBuilder 和 CriteriaQuery 来构建我对数据库的查询,但是我遇到了一个我不知道如何解决的问题,因为我对这个叫做 JPA 的整个考验还很陌生。
在 Java 中,我为名为 Report 的类设置了一个名为 timestamp 的属性,并将其设置为相同的对应 @TemporalType。 我还有一个名为 Affiliate 的类,其中包含一个 Report 对象列表。
在我的查询中,我想获取在最近的 Affiliate.maxSilenceMinutes 中没有Report 的所有Affiliate 对象。
我的问题:
- 标准化 JPA 中是否有任何方法可以修改日期?像 CriteriaBuilder.subtractMilliseconds(Expression
, Long) 之类的? - 如果没有,是否有办法将 Expression
转换为 Expression 以便我可以减去 currentTimestamp获取 CriteriaBuilder.lessThanOrEqualTo(greatestReportTimestampMs, minimumAllowedMs) 的最小值的文字?
我知道这听起来像是一个令人困惑的问题,但主要部分很简单:是否可以将 Expression
希望你们能帮忙,因为我觉得有点卡住了:)
最佳答案
如果在查询的时候知道要减去的值, 你可以预先减去:
Calendar c = new Calendar();
c.setTime(timestamp.getTimestamp());
c.add(DAY, - someNumberOfDays); //or whatever unit you want
Date d = c.getTime();
如果没有,你可能需要调用一个数据库函数来做减法,通过
CriteriaBuilder.function()
CriteriaBuilder.lessThanOrEqual()
适用于 Comparables。时间戳具有可比性。所以你可以通过 new Timestamp(long ms)
构造一个时间戳
并将其与另一个表达式进行比较。
希望对您有所帮助。
关于Java 持久性标准;将 Expression<Timestamp> 转换为 Expression<Long>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4967769/