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

时间:2016-11-05 12:57:11

标签: jpa db2 openjpa

我正在使用 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小时开始尝试。

2 个答案:

答案 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提供程序的错误。

请参阅https://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000818.html

答案 1 :(得分:0)

您需要提供有关您的实体,persistence.xml和查询的更多详细信息以获取底部或此内容。但是,我没有看到OpenJPA如何使用CHAR_LENGTH而不是LENGTH用于DB2。让我解释。如果你在这里看DBDictionary:

https://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java?view=markup

你可以看到它定义了一个名为&#34; stringLengthFunction&#34;如下:

public String stringLengthFunction =&#34; CHAR_LENGTH({0})&#34;;

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

https://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractDB2Dictionary.java?view=markup

覆盖如下:

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