首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java准则;将Expression<Timestamp>转换为Expression<Long>?

Java准则;将Expression<Timestamp>转换为Expression<Long>?
EN

Stack Overflow用户
提问于 2011-02-11 10:09:16
回答 2查看 2.2K关注 0票数 4

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

在Java中,对于一个名为Report的类,我有一个名为时间戳的属性,它被设置为相同的@TemporalType。我还有一个名为代销商的类,它有一个Report对象列表。

在我的查询中,我希望获取上一个Affiliate.maxSilenceMinutes.中没有报表的所有从属对象。

我的问题:

  1. 在标准化的JPA中有修改日期的方法吗?类似于CriteriaBuilder.subtractMilliseconds(Expression,Long)之类的?如果不是
  2. ,是否有一种将表达式转换为Expression的方法,以便我可以在currentTimestamp文本上减去一个CriteriaBuilder.lessThanOrEqualTo(greatestReportTimestampMs,minimumAllowedMs)

的最小值

我知道这可能是一个令人困惑的问题,但主要的部分是:是否可以将表达式转到Expression?如果我尝试使用.as(Long.class)方法,它会为我抛出一个异常,但在大多数DB中哪种应该是默认的底层数据类型呢?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-15 21:35:26

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

代码语言:javascript
复制
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()在可比较的上工作。时间戳是可比的。因此,您可以通过new Timestamp(long ms)构造一个时间戳,并将其与其他表达式进行比较。

我希望这能帮到你。

票数 0
EN

Stack Overflow用户

发布于 2011-04-24 19:53:23

这不是构建在Hibernate中的,所以您需要某种类型的自定义函数。

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

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

甲骨文:(timestamp + secs/86400)

SQLServer:DATEADD(ss,secs,timestamp)

DB2:(timestamp + secs SECONDS)

MySQL:DATE_ADD(timestamp, INTERVAL secs SECONDS)

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4967769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档