我正在使用 openJpa查询中的length(ze.string)> 2。但我得到了
SQLCODE=-440, SQLSTATE=42884, SQLERRMC=CHAR_LENGTH;FUNCTION, DRIVER=3.53.95 {prepstmnt 1776269692 SELECT t0.f1, t0.f2, t0.f3, t0.f4, t0.f5, t0.f6, t0.f7, t0.f8, t0.f9, t0.f10, t0.f11, t0.f12, t0.f13, t0.f14, t0.f15, t0.f16, t0.f17 FROM table t0 WHERE (t0.f1 = ? AND CHAR_LENGTH(?) > ? AND .....
在简单查询中,当我进行长度操作时,我正在获取记录,但使用jpa无法正常工作。我查看Here使用的尺寸不起作用。该字段是varchar和db2。从过去1小时开始尝试。
答案 0 :(得分:0)
DB2需要使用SQL函数#include <ctype.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
for (int i = 1; i < argc; i++) {
putchar(toupper((unsigned char)argv[i][0])));
}
putchar('\n');
return 0;
}
,但OpenJPA似乎错误地将您的JPQL转换为使用SQL函数LENGTH
(因此错误消息 - 而不是DB2发出明确的消息说明什么是错了,谁知道SQLCODE = -440是什么,而不必搜索!!)。
提出JPA提供程序的错误。
答案 1 :(得分:0)
您需要提供有关您的实体,persistence.xml和查询的更多详细信息以获取底部或此内容。但是,我没有看到OpenJPA如何使用CHAR_LENGTH而不是LENGTH用于DB2。让我解释。如果你在这里看DBDictionary:
你可以看到它定义了一个名为&#34; stringLengthFunction&#34;如下:
public String stringLengthFunction =&#34; CHAR_LENGTH({0})&#34;;
这是字符串长度函数,应该用于每个单独的字典(即数据库配置)。但是,对于DB2,AbstractDB2Dictionary,请参见:
覆盖如下:
stringLengthFunction =&#34; LENGTH({0})&#34 ;;
鉴于此,对于DB2,应该使用LENGTH。我采用了以下简单查询:
&#34;从MyEntity中选择me.id我的长度(me.name)&gt; 2&#34;
使用DB2在OpenJPA上执行它,我得到了这个:
从MYENTITY中选择t0.ID t0 WHERE(CAST(LENGTH(t0.ID)AS BIGINT)&gt; CAST(?AS BIGINT))[params =(long)2]
谢谢,
Heath Thomann