mybatis не возвращает все строки при ленивой загрузке - PullRequest
0 голосов
/ 14 февраля 2020
Приложение

My java при использовании mybatis (3.4.4) для запроса oracle сервер не возвращает все строки при ленивой загрузке.

По существу,

  • , когда я запрашиваю свою базу данных с помощью какого-либо инструмента SQL (например, oracle Sql Developer), я получаю 4000 результатов

  • , когда я запрашиваю с помощью selectCursor , что приводит к отложенной загрузке conn.selectCusror(query) Я получаю только 560 результатов!

  • , когда я запрашиваю, используя selectList , который будет извлекать все результаты сразу conn.selectList(query) I Я получаю 4000 результатов (соответствует базе данных)

Примечание : Курсор предлагает те же результаты, что и список, за исключением того, что он лениво выбирает данные с помощью итератора. Документация

Вот как я подсчитываю количество записей

Cursor<Object> cur = conn.selectCursor(query) ; // query definition is written below
int count =0;
for(Object ob : cur){
    count++;
}
System.out.println(count);

QUERY

<select id="query" fetchSize="20000" resultType="java.util.Map" >
    select distinct code from my CODES_VIEW
</select>

Может кто-нибудь посоветуйте, пожалуйста, почему selectCursor не дает всех 4000 результатов

1 Ответ

0 голосов
/ 19 февраля 2020

После нескольких дней я нашел это решение:

Мой набор результатов из запроса содержит строку (561) с нулевыми значениями в столбце. Это не должно быть проблемой, поскольку у меня могут быть нулевые значения в столбцах, которые я выбрал. В этом случае столбец code имеет значение null в строке 561. При извлечении записей с помощью selectCursor (ленивый метод извлечения данных) mybatis считает, что это конец записи, когда все столбцы в выбранной строке равны нулю.

MyBatis по умолчанию возвращает значение NULL, если все столбцы возвращаемой строки имеют значение NULL. Когда этот параметр включен, MyBatis возвращает пустой экземпляр. Обратите внимание, что он также применяется к вложенным результатам (т. Е. К объединению и ассоциации). Поскольку: 3.4.2 https://mybatis.org/mybatis-3/configuration.html

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

Следовательно, решение состоит в том, чтобы включить приведенную ниже настройку в конфигурацию mybatis. xml

<setting name="returnInstanceForEmptyRow" value="true" />
...