Java持久性标准;演员表<;时间戳>;表达<;长>;?

Java持久性标准;演员表<;时间戳>;表达<;长>;?,java,generics,jpa,criteria,Java,Generics,Jpa,Criteria,我正在使用CriteriaBuilder和CriteriaQuery来构建对数据库的查询,但我遇到了一个我不知道如何解决的问题,因为我对整个称为JPA的考验非常陌生 在Java中,对于名为Report的类,我有一个名为timestamp的属性,它被设置为相同的@TemporalType。 我还有一个名为Affiliate的类,它有一个报告对象列表 在我的查询中,我想获取在最后一个Affiliate.maxsinerminutes中没有报告的所有Affiliate对象 我的问题是: 在标准化JPA

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

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

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

我的问题是:

  • 在标准化JPA中有没有修改日期的方法?像一个标准生成器。减去毫秒(表达式,长)
  • 如果没有,是否有方法将表达式转换为表达式,以便我可以在当前时间戳文本上进行减法,以获得标准生成器的最小值。lessThanOrEqualTo(greatestreporttimestamp,minimumAllowedMs)
  • 我知道这可能是一个令人困惑的问题,但主要部分很简单:是否可以将表达式转换为表达式?如果我尝试使用.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()
    适用于可比数据。时间戳是可比较的。因此,您可以通过
    新时间戳(长ms)
    并将其与另一个表达式进行比较


    我希望这会有所帮助。

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

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

    如果您没有可用的,那么您必须找出正确的特定于数据库的实现是什么,并且这里有很多变化。例如:

    Oracle:
    (时间戳+秒/86400)

    SQLServer:
    DATEADD(ss,secs,timestamp)

    DB2:
    (时间戳+秒)

    MySQL:
    DATE\u ADD(时间戳,间隔秒)

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

    日期-时间操作在方言中没有标准化,在许多JDBC中也没有完全实现,这意味着您试图做的事情将很难以与数据库无关的方式编写