2013-04-24 56 views
1

我正在使用Netbeans 7.3,Glassfish 3.1.2.2開發應用程序,使用EclipseLink JPA 2.0連接到AS400。所有查詢正常工作,直到我得到一個特定的NamedQuery:JPA NamedQuery返回空ResultList

SELECT u FROM Table1 u WHERE u.field1 IN (:field1) 
AND SUBSTRING(u.field2,3,1) IN (:hack) AND 
SUBSTRING(u.field3,2,2) IN (:field3) ORDER BY u.field1 

的參數設置如下:

Query query = getEntityManager().createNamedQuery("Table1.findAllWithRestrictions").setParameter("hack", "'S','C'").setParameter("field1", start).setParameter("field3", finish); 

查詢執行,但對空列表返回。打開日誌記錄會生成SQL:

SELECT FIELD1, FIELD2, FIELD3, FIELD4, FIELD5, FIELD6 
FROM ABC.DATAB.TABLE1 WHERE (((FIELD1 IN ('00')) AND 
(SUBSTR(FIELD2, 3, 1) IN ('S','C'))) AND 
(SUBSTR(FIELD3, 2, 2) IN ('0S'))) ORDER BY FIELD1 ASC 

針對同一個數據庫連接運行此生成的SQL將返回多行。日誌中沒有任何異常拋出,只有一個空的ResultList。我可能做錯了什麼?

+0

嘗試刪除部分AND子句,直到返回行。 – 2013-04-24 17:34:08

+0

@ToddMurray我試過你的建議,但查詢只在刪除了整個WHERE子句時才起作用。現在我想知道如果這是一個參數問題,相應地更新了問題。 – Zeratul2k 2013-04-24 18:12:41

+2

'setParameter(「hacK」,...)'需要一個列表作爲第二個參數。您正在傳遞一個文字字符串。 [看到這裏](http://stackoverflow.com/questions/4378824/adding-in-clause-list-to-a-jpa-query) – 2013-04-24 18:34:16

回答

0

出於性能原因,JPA的一些實現採用緩存(例如EclipseLink)。如果數據庫中的數據與您在正在運行的應用程序中看到的數據不符,我會嘗試重新啓動。此外,你可能想要看看有什麼方法刷新緩存或禁用它。

示例:Eclipselink JPA caching

+0

我懷疑問題是緩存相關的,因爲我已經被迫重新啓動幾次,試圖隔離這個原因。在任何情況下,我嘗試了你的建議並以編程方式刷新緩存,但儘管所有其他NamedQueries都正常工作,ResultList仍然是空的。我將編輯問題以添加如何設置參數。 – Zeratul2k 2013-04-24 18:06:49