2014-04-22 42 views
3

我需要知道如何在Java Persistence中的@NamedQuery中調用SQL函數,如HOUR()
爲了簡化起見,在一個具有開始時間(TIMESTAMP)列的表中,我需要獲取具有介於CURRENT_TIMESTAMPHOUR(CURRENT_TIMESTAMP)+1之間的startime的行。我在Google上度過了一天,但仍然無法找到答案。如何在Java持久性的@NamedQuery中調用像「HOUR()」這樣的SQL函數

以下查詢在與JAVADB一起嘗試時有效,但在@NamedQuery中也是如此。

的Java DB實例

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.]] 

回答

2

爲了清楚起見,我添加了在JPQL中聲明函數的確切語法。 @Neil是正確的,但對FUNCTION名稱使用雙引號不起作用。 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使用功能的問題。

+0

,這顯然不是標準的JPQL(您不會在其中的任何位置找到'FUNC'),並且FUNCTION *是*標準JPQL。看起來你的JPA提供者還不支持這個標準 –

-2

使用

formatter = new SimpleDateFormat("HH"); 
hour = formatter.format(CURRENT_TIMESTAMP); 
+1

我正在尋找能夠滿足@NamedQuery語法的SQL查詢。我需要從Java DB中獲取數據。您的建議將特定於格式化日期嗎? –

0

JPA 2.1允許在JPQL查詢字符串中使用"FUNCTION(funcName, args)"。使用它並將funcName設置爲「HOUR」(或者對於有問題的數據庫)。

+0

以各種形式嘗試了下面的內容,並且出現錯誤:必須指定函數名稱,狀態字段e.EMPLOYEEID無法解析爲有效類型。同樣的FIRSTNAME,STARTTIME,ENDTIME'@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 FUNCTION(HOUR,r.STARTTIME)= FUNCTION(HOUR,CURRENT_TIMESTAMP)「) –

+0

函數名稱必須用引號引起來,因爲它是初學者的字符串。 –

+0

當我添加引號時,我得到「)預期」錯誤。無論以前發生了什麼都是一個警告,並且在應用程序運行時造成問題。現在,它是一個錯誤。 '@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」FUNCTION(HOUR ,r.STARTTIME)「=」FUNCTION(HOUR,CURRENT_TIMESTAMP)「」)' 如果我缺少一些東西,你能否告訴我。 –

相關問題