【问题标题】:Converting datetime to a long timestamp in JPQL在 JPQL 中将日期时间转换为长时间戳
【发布时间】:2013-01-02 08:25:40
【问题描述】:

我有一个包含两列的实体:

// time when the event happened (stored in UTC)
@Temporal(TemporalType.TIMESTAMP)
private Date eventTime;

// timezone offset in milliseconds
// so local millis are eventTime.getTime() + offset
@Basic
private int offset;

在 JPQL 查询中,I can't use something 似乎像 WHERE eventTime + offset > :parameter。但是是否可以通过某种方式将eventTime 转换为 long 来解决?当然,也可以选择使用原生查询...

编辑: 它不受标准支持,也未在 OpenJPA 文档中提及,因此目前可能无法实现。

【问题讨论】:

    标签: jpa openjpa


    【解决方案1】:

    您可能无法修改表,但您是否可以只添加另一列,即计算出的带有偏移量的时间戳?然后将所有查询都以此为基础?它也可能会产生更好的性能。

    我解决此类问题的另一种方法是创建一个 SQL 视图并基于该视图创建一个不同的 @Entity。当我需要大量复杂的计算并且不希望代码本身具有所有这些复杂性时,我已经这样做了。当您有其他基于非 JPA 的应用程序想要获取相同的信息(例如报告引擎)时,这很有用。虽然此解决方案最终使用 SQL 视图,但它允许您的 Java/JPA 代码不必处理本机查询。

    【讨论】:

    • PostgreSQL 不支持计算列,AFAIK (stackoverflow.com/questions/8250389/…)。将其实际存储在数据库中 1) 破坏规范化; 2) 需要大量存储空间(此表将来可能会以数十亿行结束,实际上有 2 个时间戳,因此将每行增加 16 个字节是个坏主意)。实际上,用时间戳+偏移量替换偏移量列会更好一些。使用视图也可能是个好主意。
    【解决方案2】:

    我之前在类似情况下所做的是将 setter/getter 声明为私有或受保护,然后让公共 @Transient getter 执行所需的计算。

    这解决了所有程序化问题。对于所需的 jpa sql,您需要在查询中执行适当的计算。

    【讨论】:

    • 整个问题是在 JPQL 中似乎没有办法对日期进行计算。
    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 2017-04-25
    • 2022-01-08
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多