我需要知道如何在 Java Persistence 中的 @NamedQuery
中调用 SQL
函数,如 HOUR()
。
为简化起见,在具有开始时间 (TIMESTAMP
) 列的表中,我需要获取开始时间介于 CURRENT_TIMESTAMP
和 HOUR( 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/