OpenJpa如何在JPQL中查找字符串长度

OpenJpa如何在JPQL中查找字符串长度,jpa,db2,openjpa,Jpa,Db2,Openjpa,我正在使用 openJpa查询中的长度(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

我正在使用 openJpa查询中的长度(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它不起作用。我看起来像是用过的尺寸,它不起作用。字段是varchar和db2。从过去1小时开始尝试。

DB2需要使用SQL函数
LENGTH
,但OpenJPA似乎错误地将JPQL转换为使用SQL函数
CHAR\u LENGTH
(因此错误消息-不是DB2给出明确的消息说明什么是错误的,谁知道SQLCODE=-440是什么而不必搜索!!)。 在您的JPA提供商上引发错误


请参见

DB2需要使用SQL函数
LENGTH
,但OpenJPA似乎错误地将JPQL转换为使用SQL函数
CHAR_LENGTH
(因此出现了错误消息-不是DB2给出了明确的消息,说明了什么是错误的,谁知道SQLCODE=-440是什么而不必搜索!!)。 在您的JPA提供商上引发错误


请参见

,您需要提供有关实体、persistence.xml和查询的更多详细信息,以了解最底层或最底层。但是,我不知道OpenJPA如何在DB2中使用CHAR_LENGTH而不是LENGTH。让我解释一下。如果您在这里查看DBDictionary:

您可以看到它定义了一个名为“stringLengthFunction”的函数,如下所示:

公共字符串stringLengthFunction=“CHAR_LENGTH({0})”

这是字符串长度函数,应用于每个单独的字典(即数据库配置)。但是,对于DB2抽象db2dictionary,请参见此处:

如下所示:

stringLengthFunction=“长度({0})”

因此,对于DB2,应该使用长度。我接受了以下简单的查询:

“从MyEntity me中选择me.id,其中长度(me.name)>2”

并使用DB2在OpenJPA上执行,我得到了以下结果:

从MYENTITY t0中选择t0.ID,其中(CAST(长度(t0.ID)为BIGINT)>CAST(?为BIGINT))[params=(长)2]

谢谢


Heath Thomann

您需要提供有关实体、persistence.xml和查询的更多详细信息,才能了解到底。但是,我不知道OpenJPA如何在DB2中使用CHAR_LENGTH而不是LENGTH。让我解释一下。如果您在这里查看DBDictionary:

您可以看到它定义了一个名为“stringLengthFunction”的函数,如下所示:

公共字符串stringLengthFunction=“CHAR_LENGTH({0})”

这是字符串长度函数,应用于每个单独的字典(即数据库配置)。但是,对于DB2抽象db2dictionary,请参见此处:

如下所示:

stringLengthFunction=“长度({0})”

因此,对于DB2,应该使用长度。我接受了以下简单的查询:

“从MyEntity me中选择me.id,其中长度(me.name)>2”

并使用DB2在OpenJPA上执行,我得到了以下结果:

从MYENTITY t0中选择t0.ID,其中(CAST(长度(t0.ID)为BIGINT)>CAST(?为BIGINT))[params=(长)2]

谢谢

希思·托曼