jt400 Trunc my where condition as like clause



我正在使用jt400-9.3.jar连接DB2/AS400。

我的表BAND有以下记录:

+-----|------------------+
| MAT |     NAME         |
+-----|------------------+
|100  | Paul McCartney   |
|101  | John Lennon      |
|102  | Ringo Starr      |
|103  | George Harrison  |

我的桌子MUSICIAN带有:

+------|------------------+
|MAT   |  NAME            |
+------|------------------+
|1001  | Pete Best        |
|1002  | Stuart Sutcliffe |
|1003  | Jimmy Nicol      |
|1004  | Tommy Moore      |
|1005  | Norman Chapman   |

当我运行这个选择

SELECT t.mt, t.name
FROM (      
SELECT 
trim(b.mat) AS mat, 
trim(b.name) AS name
FROM band b
WHERE trim(b.mat) = '1001'
UNION 
SELECT 
trim(m.mat) AS mat, 
trim(m.name) AS name
FROM MUSICIAN m
WHERE trim(m.mat) = '1001'
) AS t
FETCH FIRST 1 ROWS ONLY

我检索:

+-----|----------------+
|MAT  |NAME            |
+-----|----------------+
|100  | Paul McCartney |

第一个查询用作like子句。1001100匹配,但句子是=而不是like

当我在dbeaver中执行查询时是有效的,但在java中(使用PreparedStatement)我错了,驱动程序有一些配置吗?

John Eberhard为我快速回答了这个问题。

https://sourceforge.net/p/jt400/bugs/121/

注册您的答案。

问题是在查询中使用了=。因为=用于查询,然后数据库告诉驱动程序类型为CHAR(5)。然后,驱动程序截断为字符5。

有两种可能的解决方案。

  1. 向参数标记添加强制转换,以便较大的字符能够适应并进行错误比较。即从MYTABLE中选择*,其中MAT=铸造(?如VARCHAR(80))

  2. 使用"query replace truncated parameter"JDBC属性。看见https://static.javadoc.io/net.sf.jt400/jt400/9.7/com/ibm/as400/access/doc-files/JDBCProperties.html

以下是该属性的定义方式。

"查询替换截断的参数">

指定应用于代替截断的值SQL查询的参数。默认情况下,参数是静默的截断为参数的长度。考虑以下内容脚本

表T1有一个CHAR(3)列,名称为C1,还有一行,其中C1="ABC"。应用程序使用SELECT*FROM准备语句TABLE_X,其中C1=?如果参数设置为"ABCD",则静默地截断为"ABC",查询将返回一行。

此属性允许应用程序设置应用程序中不存在的字符串,即。@@@@@@@。空值表示该属性将被忽略。

最新更新