在DB2z/OS上通过EclipseLink替换函数

在DB2z/OS上通过EclipseLink替换函数,db2,websphere,eclipselink,jpa-2.0,db2-zos,Db2,Websphere,Eclipselink,Jpa 2.0,Db2 Zos,我正在使用z/OS上的DB212,将一个应用程序从WebSphere8.5上带有OpenJPA的JPA2.0迁移到WebSphere9.0上带有EclipseLink的JPA2.1。一般来说,它是有效的,但有一个相当复杂的查询失败了。我可以将问题局限于在条件查询中使用自定义DB2函数调用。该呼叫看起来如下所示: criteriaBuilder.function("REPLACE", String.class, fromMyEntity.get("myField"), criteriaBuilde

我正在使用z/OS上的DB212,将一个应用程序从WebSphere8.5上带有OpenJPA的JPA2.0迁移到WebSphere9.0上带有EclipseLink的JPA2.1。一般来说,它是有效的,但有一个相当复杂的查询失败了。我可以将问题局限于在条件查询中使用自定义DB2函数调用。该呼叫看起来如下所示:

criteriaBuilder.function("REPLACE", String.class, fromMyEntity.get("myField"), criteriaBuilder.literal("a"), criteriaBuilder.literal("b"));
这会产生以下错误(必须翻译一些错误文本,因为WebSphere将它们本地化,并匿名化我的字段/表名,因此标签/名称可能不是100%准确):

真正让我困惑的是,如果我接受生成的查询,用给定的绑定参数替换占位符,然后自己在数据库客户机中执行,它就可以正常工作

文档声明,第一个参数不能为空(),事实上,如果我在查询或数据库客户端中使用空字符串作为文本,它将产生上述错误。但是数据库中没有一行包含空值。在旧环境中有一些检查可以防止出现这种情况,但它们在新环境中似乎不起作用,因此我在搜索问题时禁用了它们,并确保自己不存在空值。我甚至可以使用主键作为第一个参数,但它仍然会失败,甚至不能包含空/null值

使用其他函数(如TRANSLATE)工作时,我也尝试使用“SYSIBM.REPLACE”作为名称和不同的参数组合,但只要我使用实列替换中的数据,它就失败了。有人知道我做错了什么吗

这是我的表定义:

CREATE TABLE "MY_TABLE" (
"ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (NO MINVALUE NO MAXVALUE NO CYCLE CACHE 20 NO ORDER ), 
"MYFIELD" VARCHAR(160) FOR MIXED DATA WITH DEFAULT NULL,
[....]
) IN "<Database>"."<Tablespace>" PARTITION BY SIZE EVERY 4 G AUDIT NONE DATA CAPTURE NONE CCSID UNICODE;
创建表格“我的表格”(
默认情况下,作为标识生成的“ID”整数不为NULL(无最小值无最大值无循环缓存20无顺序),
“MYFIELD”VARCHAR(160)用于默认为空的混合数据,
[....]
)在“.”分区中,按大小每4 G审计一次无数据捕获一次无CCSID UNICODE;

列MYFIELD(replace函数的第一个参数)的Db2数据类型和编码是什么?问题不在数据库中,而是来自代码的绑定参数的值:
SQLCODE=-171,SQLSTATE=42815,SQLERRMC=2;REPLACE
表示函数的第二个参数,即要替换的字符串是问题所在,它是varchar(160),编码应该是unicode。我在问题中添加了ddl。@mustaccio我认为你是对的,如果我使用列而不是文字作为第二个参数,它就可以工作了。但是我如何让它与文字一起工作?@mustaccio edit它只在我省略第三个参数的情况下工作。如果我使用文字作为第三个参数,SQLERRMC将更改为“3;REPLACE”。但该参数甚至可能为空,调用应该仍然有效。那么为什么“REPLACE”函数不能处理文本呢?“翻译”例如作品。。。
CREATE TABLE "MY_TABLE" (
"ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (NO MINVALUE NO MAXVALUE NO CYCLE CACHE 20 NO ORDER ), 
"MYFIELD" VARCHAR(160) FOR MIXED DATA WITH DEFAULT NULL,
[....]
) IN "<Database>"."<Tablespace>" PARTITION BY SIZE EVERY 4 G AUDIT NONE DATA CAPTURE NONE CCSID UNICODE;