当前位置: 首页 > 知识库问答 >
问题:

JPQL CURRENT_TIMESTAMP偏移2小时

宿镜
2023-03-14
    null
Query q = getManager().createQuery("select o.id, CURRENT_TIMESTAMP from OutboundMessage o where o.id=11370");
Timestamp current_timestamp = (Timestamp)((Object[])q.getResultList().get(0))[1];
result = {Timestamp@13972} "2016-03-31 14:48:12.432215"
 cdate = {Gregorian$Date@13975} "2016-03-31T14:48:12.000+0200"
  zoneinfo = {ZoneInfo@12683} "sun.util.calendar.ZoneInfo[id="Europe/Vienna",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=139,lastRule=java.util.SimpleTimeZone[id=Europe/Vienna,offset=3600000,dstSavings=3600000,useDaylight=true,...]"
   rawOffset = 3600000
   rawOffsetDiff = 0
   dstSavings = 3600000
   ID = "Europe/Vienna"
  zoneOffset = 7200000
  daylightSaving = 3600000
  forceStandardTime = false
  locale = null

一个简单的新日期()给出(7分钟后):

result = {Date@13983} "Thu Mar 31 16:55:07 CEST 2016"
 cdate = {Gregorian$Date@13986} "2016-03-31T16:55:07.871+0200"
  zoneinfo = {ZoneInfo@12683} "sun.util.calendar.ZoneInfo[id="Europe/Vienna",offset=3600000,dstSavings=3600    000,useDaylight=true,..."
  zoneOffset = 7200000
  daylightSaving = 3600000
  forceStandardTime = false
  locale = null

我获得的启用hibernate日志记录的相应本机查询也会产生正确的时间

select outboundme0_.OM_ID as col_0_0_, CURRENT_TIMESTAMP as col_1_0_ from MAILABO_OTS_TEST.TB_OUTBOUND_MESSAGE outboundme0_ where outboundme0_.OM_ID=11370 

产量col_1_0_=2016-03-31 16:59:16.910065欧洲/柏林

在调试时,我只选择了current_timestamp并将其强制转换为java.sql.timestamp,以找出实体未被选中的原因,然后意识到current_timestamp值关闭了2小时。

我希望行为是:jqpl->转换为本机查询->在db上执行的本机查询->结果转换回java类。假设这种行为,我的应用程序的整个java端甚至不应该知道CURRENT_TIMESTAMP所包含的实际值--它应该只关心将jpql转换为本机sql,并将resultset转换回java对象

解决办法
我现在所做的是用一个命名参数替换current_timestamp

queryString="...where o.someDate < :referenceTime"
Query query = entityManager.createQuery(queryString);
query.setParameter("referenceTime", new Date());

共有1个答案

洪伟彦
2023-03-14

你的问题有点混乱。首先看一下java.sql.timestamp上的Javadoc:

注意:此类型是java.util.Date和单独的nanosseconds值的组合。只有整数秒存储在java.util.Date组件中。小数秒--纳米--是分开的。当传递一个不是java.sql.Timestamp实例的对象时,timestamp.equals(Object)方法永远不会返回true,因为date的nanos组件是未知的。因此,timestamp.equals(Object)方法与java.util.date.equals(Object)方法不对称。此外,hashCode方法使用底层java.util.Date实现,因此在其计算中不包括nanos。

由于上面提到的Timestamp类和java.util.Date类之间的差异,建议代码不要将时间戳值作为java.util.Date的实例一般地查看。Timestamp和java.util.Date之间的继承关系实际上表示实现继承,而不是类型继承。

如果我运行这个,我会得到一个预期的结果:

Tuple t = em.createQuery("select u.id, CURRENT_TIMESTAMP from User u where u.id = 1", Tuple.class).getSingleResult();
for ( TupleElement<?> e: t.getElements()) {
    System.out.println("Element = "+e.getAlias()+":"+t.get(e));
}

我不明白你描述的问题。这给出了与上面相同的时间。

System.out.println( (Timestamp)t.get(1) );

我不知道您所说的是什么意思,但是我在Java中运行此代码时只获得0次点击。

 类似资料:
  • 我有一个Kafka消费者,我从它消费数据从一个特定的主题,我看到下面的例外。我使用的是Kafka版本。 我添加了这两个额外的消费者属性,但仍然没有帮助: 那个错误意味着什么?我该如何解决它?我需要添加一些其他消费者属性吗?

  • 问题内容: 是否可以跳过X个第一行,并在一个查询中选择所有其他行?像那样: 它将选择:pqr,stu,vwx,yz 我尝试使用LIMIT和OFFSET完成此操作,但是问题是表是动态的,而且我不知道应该输入哪个LIMIT(我不知道表中有多少行)。 问题答案: 如果只需要最后N行,请尝试以下操作: 这会根据的顺序为您提供最后几条记录。 您可以使用自动递增的主键(希望有一个主键)来确定行的顺序(如果无法

  • 我目前正在从具有特定偏移量的主题中获取消息。我正在使用寻求()来实现它。但是当我将enable.auto.commit设置为true或使用手动同步(委托同步()/委托同步())时,Seek()不起作用,因为它没有轮询来自特定偏移量的消息,而是从最后提交的偏移量中选择。 因此,在使用Seek()时,是否必须将偏移量存储在外部DB中,而不提交给Kafka?Seek和Commit不能并行工作吗? 客户端

  • 有人能解释一下这里出了什么问题吗。我猜这是有偏移和步幅的东西,但是... 顶点包含位置结构和2个浮点,颜色结构和4个GLubyte和Tex结构和2个浮点。 如果我用这段代码替换它,它工作得很好。

  • 我使用的是“亚洲/曼谷”区域id。该偏移是从格林尼治时间UTC 07:00开始的。 但是当我做了下面的事情时,设置为“01/01/1900 7:00:00.000”时不是7:00 结果就是 周一一月一日07:00:00 ICT 1900 -402 周一一月一日06:00:00 ICT 1900 -420 我想知道偏移量是否在1900年1月1日早上7点左右发生了变化,所以我在维基百科上查了一下。ht

  • 一切都清楚一次是UTC中的日期: