2013-04-24 60 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