jt400 Trunc我的where条件如条款

时间:2019-02-08 11:06:57

标签: jt400

我正在使用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),我弄错了,驱动程序有一些配置吗?

1 个答案:

答案 0 :(得分:0)

约翰·埃伯哈德(John Eberhard)对我的问题回答得如此之快。

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

注册答案。

  

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

     

有两种可能的解决方案。

     
      
  1. 将强制类型转换添加到参数标记,以便较大的字符适合并且比较不正确。   即SELECT * FROM MYTABLE WHERE MAT = CAST(?AS VARCHAR(80))

  2.   
  3. 使用“查询替换截断的参数” JDBC属性。参见https://static.javadoc.io/net.sf.jt400/jt400/9.7/com/ibm/as400/access/doc-files/JDBCProperties.html

  4.   
     

此处是该属性的定义方式。

     

“查询替换截断参数”

     

指定代替截断应使用的值   SQL查询的参数。默认情况下,该参数为静默   截断为参数的长度。考虑以下   场景。

     

表T1的CHAR(3)列的名称为C1,其中一行   C1 ='ABC'。应用程序使用SELECT * FROM准备一条语句   TABLE_X其中C1 =?如果参数设置为“ ABCD”,它将是   默默地被截断为“ ABC”,查询将返回一行。

     

此属性通过允许应用程序设置来避免此问题   字符串到应用程序中不存在的内容-即   @@@@@@@@@。空值表示该属性将被忽略。