Java 返回空结果列表的JPA NamedQuery
我正在使用Netbeans 7.3、Glassfish 3.1.2.2开发一个应用程序,该应用程序使用EclipseLink JPA 2.0连接到AS400。所有查询都能正常工作,直到我找到一个特定的名称查询: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.
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都工作正常。我将编辑该问题以添加参数的设置方式。