jt400 усечь мое условие where как предложение - PullRequest
0 голосов
/ 08 февраля 2019

Я использую 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, но предложение: = no like.

Когда я выполняю запрос в dbeaver works, но в java (используя PreparedStatement) я ошибся,есть какая-нибудь конфигурация для драйвера?

1 Ответ

0 голосов
/ 08 февраля 2019

Джон Эберхард так быстро ответил о проблеме для меня.

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

Регистрация вашего ответа.

Проблема в том, что = используетсяв запросе.Поскольку = используется в запросе, база данных сообщает драйверу, что типом является CHAR (5).Затем драйвер усекается до 5-го символа.

Возможны два решения.

  1. Добавьте приведение к маркеру параметра, чтобы больший символ соответствовал и не совпадал.то есть SELECT * FROM MYTABLE, ГДЕ MAT = CAST (? AS VARCHAR (80))

  2. Используйте свойство 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», и запрос будет возвращать строку.

Это свойство позволяет избежать этой проблемы, позволяя приложению установить строку в нечтокоторый не существует в приложении - то есть @@@@@@@.Пустое значение означает, что свойство будет игнорироваться.

...