Подготовленный оператор возвращает частичные записи, т. Е. 3, тогда как SQL-разработчик для того же запроса возвращает все записи, т. Е. 5 - PullRequest
0 голосов
/ 15 февраля 2019

Я столкнулся с очень странной проблемой

Java-код:

preparedStatement = conn.prepareStatement(strSql);
resultset = preparedStatement.executeQuery();

Во время отладки я попытался найти SQL-код:

SELECT JOBLOG.JOB_EVENT_CODE,JOBLOG.LOG_DATETIME,JOBLOG.MESSAGE_TEXT,B.ITEM_DESC1
FROM JOB_LOG JOBLOG,REF_DATA_ITEM_MASTER B WHERE JOBLOG.BATCH_ID = ? 
AND JOBLOG.JOB_EVENT_CODE = B.ITEM_ID AND B.CATEGORY_ID = 105
ORDER BY JOBLOG.JOB_LOG_ID ASC 

Параметр был заменен на 20021854

Приведенный выше запрос при запуске через код Java имеет размер набора результатов, равный 3

resultset = preparedStatement.executeQuery();

Но если я запускаю тот же запрос в sqldeveloper Iвыводим 5 записей

SELECT JOBLOG.JOB_EVENT_CODE,JOBLOG.LOG_DATETIME,JOBLOG.MESSAGE_TEXT,B.ITEM_DESC1 
FROM JOB_LOG JOBLOG,REF_DATA_ITEM_MASTER B
WHERE JOBLOG.BATCH_ID = 20021854 AND JOBLOG.JOB_EVENT_CODE = B.ITEM_ID AND B.CATEGORY_ID = 105
ORDER BY JOBLOG.JOB_LOG_ID ASC

Для добавления дополнительной информации мой ORM - Ibatis.Что может быть причиной этого несоответствия

Ответы [ 2 ]

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

То, что часто забывают / упускают из виду, особенно с профсоюзами и взглядами: getMoreResults.

Здесь это выглядит не так, но попробуйте:

do {
    ...
    try (ResultSet resultset = preparedStatement.executeQuery()) {
        ...
    }
} while (preparedStatement.getMoreResults());

Однако я не удивлюсь, если переменная resultset будет повторно использована для другого запроса (в не показанном коде) и, следовательно, преждевременно запущена до конца.Объявите это как можно ближе к ресурсам с автоматическим resultset.close() даже при возврате / исключении.

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

Причины, по которым я могу придумать:

  1. Вы вставили новые строки в SQL-разработчик, но не зафиксировали транзакцию, поэтому только SQL-разработчик может видеть новые строки, но не Java-программу (этообщий сценарий :))
  2. Вы подключаетесь к 2 различным базам данных, проверьте
  3. Вы используете setMaxRows в PreparedStatment?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...