Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回空结果列表的JPA NamedQuery_Java_Jpa_Eclipselink_Ibm Midrange - Fatal编程技术网

Java 返回空结果列表的JPA NamedQuery

Java 返回空结果列表的JPA NamedQuery,java,jpa,eclipselink,ibm-midrange,Java,Jpa,Eclipselink,Ibm Midrange,我正在使用Netbeans 7.3、Glassfish 3.1.2.2开发一个应用程序,该应用程序使用EclipseLink JPA 2.0连接到AS400。所有查询都能正常工作,直到我找到一个特定的名称查询: 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.

我正在使用Netbeans 7.3、Glassfish 3.1.2.2开发一个应用程序,该应用程序使用EclipseLink JPA 2.0连接到AS400。所有查询都能正常工作,直到我找到一个特定的名称查询:

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将返回多行。日志中任何地方都不会抛出异常,只有一个空的结果列表。我可能做错了什么?

出于性能原因,JPA的一些实现采用了缓存(如EclipseLink)。如果数据库中的数据与正在运行的应用程序中的数据不一致,我会尝试重新启动。此外,您可能希望了解刷新缓存或禁用缓存的方法


示例:

尝试删除AND子句的一部分,直到返回行为止。@ToddMurray我尝试了您的建议,但只有当我删除整个WHERE子句时,查询才起作用。现在我想知道这是否是一个参数问题,相应地更新了问题。
setParameter(“hacK”,…)
需要一个列表作为第二个参数。您正在传递一个文本字符串。好了,问题解决了。这是几个因素的混合,我只是在遵循@ToddMurray的建议后才注意到它们。首先,IN子句的参数必须在列表中,而不是作为串联字符串。第二,也是最重要的一点,我接收到的参数包括作为字符串分隔符的单引号,在将它们传递给setParameter之前,必须去掉这些单引号。在解决了所有这些小问题之后,我终于收到了一个包含预期数据的结果列表。(我试着将此作为问题的答案,但我目前还没有足够的声誉)我怀疑这个问题与缓存有关,因为我已经被迫重新启动了好几次,试图找出原因。无论如何,我尝试了您的建议,并通过编程刷新了缓存,但是结果列表仍然是空的,尽管所有其他namedquery都工作正常。我将编辑该问题以添加参数的设置方式。