java - 如何在 Java Persistence 中的 @NamedQuery 中调用类似 "HOUR()"的 SQL 函数

标签 java jpa named-query

我需要知道如何在 Java Persistence 中的 @NamedQuery 中调用 SQL 函数,如 HOUR()
为简化起见,在具有开始时间 (TIMESTAMP) 列的表中,我需要获取开始时间介于 CURRENT_TIMESTAMPHOUR( CURRENT_TIMESTAMP)+1。我在谷歌上花了一天时间,仍然没有找到答案。

以下查询在使用 JAVADB 时有效,但在 @NamedQuery 中同样失败。

Java 数据库实例:

    select e.EMPLOYEEID, e.FIRSTNAME, r.STARTTIME, r.ENDTIME from reservation r, employee e
where e.EMPLOYEEID = r.EMPLOYEEID AND HOUR(r.STARTTIME) = HOUR(CURRENT_TIMESTAMP)

@NamedQuery:

    @NamedQuery(name="reservation.getcurrent",query = "select e.EMPLOYEEID, e.FIRSTNAME,
r.STARTTIME, r.ENDTIME from reservation r, employee e where e.EMPLOYEEID = r.EMPLOYEEID
AND HOUR(r.STARTTIME) = HOUR(CURRENT_TIMESTAMP)")

错误:

[2014-04-22T17:03:00.946+0530] [glassfish 4.0] [SEVERE] [] [javax.enterprise.system.core] [tid: _ThreadID=38 _ThreadName=admin-listener(5)] [timeMillis: 1398166380946] [levelValue: 1000] [[
  Exception while deploying the app [LyndaPortalReservation] : Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Deployment of PersistenceUnit [LyndaPortalReservationPU] failed. Close all factories for this PersistenceUnit.
Internal Exception: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing [select e.EMPLOYEEID, e.FIRSTNAME, r.STARTTIME, r.ENDTIME from reservation r, employee e where e.EMPLOYEEID = r.EMPLOYEEID AND HOUR(r.STARTTIME) = HOUR(CURRENT_TIMESTAMP)]. 
[126, 169] The right expression is not a valid expression.]]

最佳答案

为清楚起见,我添加了在 JPQL 中声明函数的确切语法。 @Neil 是正确的,但是对 FUNCTION Name 使用双引号不起作用。 FUNCTION 名称的语法是 FUNC('funcName', args)。我们需要使用单引号。因此对于寻找类似答案的其他用户。这是确切的语法。

@NamedQuery(name="reservation.getall",query = "SELECT e.employeeid, e.firstname, r.starttime, r.endtime from reservation r, employee e where e.employeeid = r.employeeid AND FUNC('HOUR', r.starttime) = FUNC('HOUR', CURRENT_TIMESTAMP)")

这有助于解决我最初在 HQL 中使用函数的问题。

关于java - 如何在 Java Persistence 中的 @NamedQuery 中调用类似 "HOUR()"的 SQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23220851/

相关文章:

java - 为什么 hibernate 需要 java.lang.Double 的默认构造函数?

java - 使用 mockito 进行参数命名查询测试

java - 如何在应用程序级别缓存复杂的java对象

Java-极小极大算法问题

java - 停止 Java 线程的安全方法

java - 要映射的实体<字符串,对象>

java - 在 libgdx 中加载资源以进行 JUnit 测试

java - DataNucleus 中的@Convert

Grails 命名查询

java - hibernate命名查询