【问题标题】:JPQL Query doesn't workJPQL 查询不起作用
【发布时间】:2016-08-11 03:26:24
【问题描述】:

您好,我想尝试运行此查询

UPDATE WarmTimeMonitoring wtm
SET wtm.warmTime = (EXTRACT(HOUR FROM CURRENT_TIMESTAMP - wtm.entryDate)*60)+ EXTRACT(MINUTE FROM CURRENT_TIMESTAMP - wtm.entryDate )
WHERE wtm.leavingDate IS NULL

当我在数据库上尝试直接查询时,它可以工作

UPDATE WARMTIME_MONITORING w
SET w.WARM_TIME = (EXTRACT(HOUR FROM CURRENT_TIMESTAMP - w.ENTRY_DATE)*60)+ EXTRACT(MINUTE FROM CURRENT_TIMESTAMP - w.ENTRY_DATE)
WHERE LEAVING_DATE IS NULL;

如果我尝试使用 JPQL,我会收到以下错误:

执行数据库查询时发生异常: IllegalArgumentException-> 创建一个异常时发生 EntityManager 中的查询:异常说明:语法错误解析 [UPDATE WarmTimeMonitoring wtm SET wtm.warmTime = (EXTRACT(HOUR FROM CURRENT_TIMESTAMP - wtm.entryDate)*60)+ EXTRACT(MINUTE FROM CURRENT_TIMESTAMP - wtm.entryDate ) WHERE wtm.leavingDate 为 NULL]。 [68, 85] 左表达式不是算术表达式。 [131, 148] 左边的表达式不是算术表达式。

谁能解释一下为什么会发生这种情况以及我该如何解决?

是的,我检查了 warmTime entryDate 和 leaveDate 是可调用的。

【问题讨论】:

  • 我猜 CURRENT_TIMESTAMP 不是要使用的有效 JPQL 属性...
  • CURRENT_TIMESTAMP 完全有效。提取不是。 HOUR 不是。 MINUTE 不是...人们在形成查询之前实际上不查看 JPQL 引用吗? JPQL!= SQL。 datanucleus.org/products/accessplatform_4_2/jpa/…
  • @NeilStockton 好吧,谢谢,我环顾四周,但没有找到一些好的例子,只是基础知识。
  • @NeilStockton 知道如何使用 jpa 执行上述查询吗?
  • 取决于您是否希望 JPQL 可移植(即仅使用标准 JPQL 函数)。使用标准 JPQL,您不能……直接使用 JPA 本机查询 (SQL)。使用非标准 JPQL 时,一些提供程序(例如 DataNucleus,我链接的文档)支持时间/日期函数……因此您可以执行 HOUR(wtm.entryDate) 和 HOUR(CURRENT_TIMESTAMP) 等操作并构建它。看看您的提供商有什么可用的?

标签: java mysql jpa


【解决方案1】:

正如@neil stockon所说,有些函数不是有效的JPQL操作,我建议先去备案,获取制作和更新所需的信息

SELECT w.ID, w.ENTRY_DATE from WARMTIME_MONITORING w
WHERE LEAVING_DATE IS NULL;

一旦您获得记录的 id 和 entry_date,就对日期执行您需要的操作,以符合新日期并执行 JPQL 更新

UPDATE WARMTIME_MONITORING w
SET w.WARM_TIME = :time
WHERE ID = :id

如果您有大量数据,这可能会非常低效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2019-12-27
    • 2021-06-23
    • 2016-03-23
    • 2015-06-29
    • 2015-11-07
    相关资源
    最近更新 更多