我正在使用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
子句。1001
与100
匹配,但句子是=
而不是like
。
当我在dbeaver中执行查询时是有效的,但在java中(使用PreparedStatement)我错了,驱动程序有一些配置吗?
John Eberhard为我快速回答了这个问题。
https://sourceforge.net/p/jt400/bugs/121/
注册您的答案。
问题是在查询中使用了=。因为=用于查询,然后数据库告诉驱动程序类型为CHAR(5)。然后,驱动程序截断为字符5。
有两种可能的解决方案。
向参数标记添加强制转换,以便较大的字符能够适应并进行错误比较。即从MYTABLE中选择*,其中MAT=铸造(?如VARCHAR(80))
使用"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",查询将返回一行。
此属性允许应用程序设置应用程序中不存在的字符串,即。@@@@@@@。空值表示该属性将被忽略。