У меня есть запрос, который выбирает один столбец, и я выполняю запрос в пакетах, используя методы setFirstResults & setMaxResults SQLQuery.
Отрывок:
SQLQuery query = <query object with query projecting a single column>;
int maxResults = 50;
int batchSize = 50;
for (int i = 0; ; i++) {
query.setFirstResult(batchSize*i);
query.setMaxResults(maxResults);
List resultSet = query.list();
if(resultSet.isEmpty())
break;
//process result set
}
Я установил в true параметр showSQL в конфигурации hibernate, чтобы увидеть строку запроса, которую создает hibernate. Для первого пакета, т.е. когда i = 0 ниже, это запрос, который генерирует hibernate:
select * from (/* query selecting single column here */) where rownum <= ?;
, что имеет смысл, поскольку это первый пакет, и мы хотим, чтобы результаты из первой строки и rownum использовались для ограничения количества результатов до maxResults.
Теперь для второго и последующих пакетных чтений запрос hibernate создает:
select * from ( select row_.*, rownum rownum_ from (/*query selecting single column here */) row_ where rownum <= ?) where rownum_ > ?;
и вы можете ясно видеть, что вышеупомянутый запрос выбирает два столбца, один из которых является самим номером строки.
Поэтому, когда мой запрос выбирает только один столбец, версия запроса в hibernate выбирает два.
Это известная проблема? Могу ли я сделать что-то другое или я делаю что-то не так?
Я не хочу преобразовывать набор результатов в два разных типа перед его использованием / обработкой.