Java 持久性标准;将 Expression<Timestamp> 转换为 Expression<Long>?

标签 java generics jpa criteria

我正在使用 CriteriaBuilder 和 CriteriaQuery 来构建我对数据库的查询,但是我遇到了一个我不知道如何解决的问题,因为我对这个叫做 JPA 的整个考验还很陌生。

在 Java 中,我为名为 Report 的类设置了一个名为 timestamp 的属性,并将其设置为相同的对应 @TemporalType。 我还有一个名为 Affiliate 的类,其中包含一个 Report 对象列表。

在我的查询中,我想获取在最近的 Affiliate.maxSilenceMinutes 中没有Report 的所有Affiliate 对象。

我的问题:

  1. 标准化 JPA 中是否有任何方法可以修改日期?像 CriteriaBuilder.subtractMilliseconds(Expression, Long) 之类的?
  2. 如果没有,是否有办法将 Expression 转换为 Expression 以便我可以减去 currentTimestamp获取 CriteriaBuilder.lessThanOrEqualTo(greatestReportTimestampMs, minimumAllowedMs) 的最小值的文字?

我知道这听起来像是一个令人困惑的问题,但主要部分很简单:是否可以将 Expression 转换为 Expression?如果我尝试使用 .as(Long.class) 方法,它会为我抛出一个异常,但在大多数数据库中,这应该是默认的底层数据类型吗?

希望你们能帮忙,因为我觉得有点卡住了:)

最佳答案

如果在查询的时候知道要减去的值, 你可以预先减去:

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/

相关文章:

Java + JPA : Search User in Database By first and last name return too many results. 有更好的方法吗?

java - Spring Data JPA @ManyToMany 增删改查

java - 如何验证我的 Java 代码是否确实发送了 POST 请求?

c# - 在 C# 中使用类型作为函数参数创建通用对象

xml - JAXB 和 JPA 将数据保存在数据库中

java - 使用泛型类型进行 Spring 依赖注入(inject)

java - Kotlin 问题 “One type argument expected for class ExpandableRecyclerAdapter”

java - selenium firefox 52.0.2 和 intellij idea 崩溃

java - 在一行上连续检查输入?

java - 从 Objective C 到 java 的 SQLite 查询