【问题标题】:Select MAX timestamp with JPA2 Criteria API使用 JPA2 Criteria API 选择 MAX 时间戳
【发布时间】: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

【问题讨论】:

    标签: java generics jpa-2.0 java-ee-6 criteria-api


    【解决方案1】:

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

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

    【讨论】:

    • 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.
    • 是的,第二句话就是这么说的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2015-11-23
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    相关资源
    最近更新 更多