使用 JPA2 Criteria API 选择 MAX 时间戳

Posted

技术标签:

【中文标题】使用 JPA2 Criteria API 选择 MAX 时间戳【英文标题】:Select MAX timestamp with JPA2 Criteria API 【发布时间】:2012-03-25 20:39:57 【问题描述】:

所以我的实体有:

@Column(name="TS", nullable=false)
private java.sql.Timestamp timestamp; 

我生成的元模型有:

public static volatile SingularAttribute<MyEntity,Timestamp> timestamp;

我想按 Max Timestamp 值选择:

Root<MyEntity> root = query.from(MyEntity.class);
Expression maxExpression = cb.max(root.get(MyEntity_.timestamp));

但我不被允许,因为:

max(Expression&lt;N&gt; x) 创建应用数值最大运算的聚合表达式。 &lt;N extends java.lang.Number&gt;表达式

当然Timestamp 不会扩展Number

如何使用 typesafe Criteria API 在Timestamp 列上执行MAX

【问题讨论】:

【参考方案1】:

应该使用CriteriaBuilder.greatest 代替max 作为时间戳(以及日期、字符串和其他可比较对象)。如果您需要 MIN 作为时间戳,请改用最少方法

类似的问题可能会面临更少/更大/相等的比较。第一个接受扩展 Number 的参数,第二个接受其他可比较的参数:

lt 与 lessThan le 与 lessThanOrEqualTo ge 与 greaterThanOrEqualTo gt 与 greaterThan

【讨论】:

sub.where(cb.greatest(histories.get("activeDate"))); [ERROR] required: javax.persistence.criteria.Expression [ERROR] found: javax.persistence.criteria.Path [ERROR] 原因:推断类型不符合上限 @SeSong 同样的问题,怎么办? 我用 max 代替 sub.where(cb.max(histories.get(History_.activeDate.getName()))); 和 CriteriaBuilder least() for MIN. 是的,第二句话就是这么说的。

以上是关于使用 JPA2 Criteria API 选择 MAX 时间戳的主要内容,如果未能解决你的问题,请参考以下文章

比较 JPA Criteria API 中的日期实体

通过 Criteria api 在 LIKE 中转义字符

使用 JPA Criteria API,你能做一个只导致一个连接的 fetch join 吗?

JPA Criteria builder IN 子句查询

jpa criteria-api:加入子选择

JPA & Criteria API - 仅选择特定列