【问题标题】:Java Persistence Criterias; Cast Expression<Timestamp> to Expression<Long>?Java 持久性标准;将 Expression<Timestamp> 转换为 Expression<Long>?
【发布时间】:2011-02-11 10:09:16
【问题描述】:

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

在 Java 中,我有一个名为 timestamp 的属性,用于名为 Report 的类,它被设置为相同的对应 @TemporalType。 我还有一个名为 Affiliate 的类,它有一个 Report 对象列表。

在我的查询中,我想获取在最后一个 Affiliate.maxSilenceMinutes 中没有报告的所有 Affiliate 对象。

我的问题:

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

我知道这可能是一个令人困惑的问题,但主要部分很简单:是否可以将 Expression 转为 Expression?如果我尝试使用 .as(Long.class) 方法,它会为我抛出异常,但无论如何它应该是大多数 DB 中的默认基础数据类型?

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

【问题讨论】:

    标签: java generics jpa criteria


    【解决方案1】:

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

    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) 构造一个时间戳 并将其与其他表达式进行比较。

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      这不是 Hibernate 内置的,因此您需要某种自定义函数。

      JDBC 标准包括一个函数转义{fn TIMESTAMPADD( SQL_TSI_SECOND, secs, timestamp)},它应该被转换为目标数据库的正确 SQL,但并非所有 JDBC 实现都提供它。因此,您可以向 Hibernate 的方言添加自定义 StandardJDBCEscapeFunction 以获得所需的结果。

      如果您没有可用的,您将不得不找出正确的数据库特定实现是什么,这里有很多可变性。例如:

      甲骨文:(timestamp + secs/86400)
      SQLServer:DATEADD(ss,secs,timestamp)
      DB2:(timestamp + secs SECONDS)
      MySQL:DATE_ADD(timestamp, INTERVAL secs SECONDS)

      一旦知道了,就可以使用正确的表达式作为 SQL 条件。

      日期时间操作在方言中没有标准化,并且在许多 JDBC 中没有完全实现,这意味着您尝试做的事情很难以数据库中立的方式编写。

      【讨论】:

        猜你喜欢
        • 2014-05-07
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多