Переход в спящий режим — получение последнего элемента результатов прокрутки с помощью ScrollMode.ТОЛЬКО для ПЕРЕСЫЛКИ

#java #hibernate #jdbc

#java #переход в спящий режим #jdbc

Вопрос:

Простое пакетное чтение Java миллионов строк с использованием JPA / Hibernate. Мой вопрос: как я могу определить последний результат в ScrollableResults с ScrollMode.FORWARD_ONLY помощью?

Используя isLast() метод, это не вариант с режимом прокрутки только вперед и с использованием ScrollMode.Функция SCROLL_INSENSITIVE снижает производительность моего пакета.

 import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.hibernate.Query;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.StatelessSession;

StatelessSession statelessSession = ((Session) em.getDelegate()).getSessionFactory().openStatelessSession();
Query query = statelessSession.createSQLQuery("MY_QUERY")
                        .setReadOnly(true)
                        .setFetchSize(Integer.valueOf(1000));
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
while (results.next()) {
...
//I need to extract a timestamp from the last record here
}
  

Комментарии:

1. Рассматривали ли вы возможность использования запроса, который вместо этого просто получает последний результат.

2. Нет, потому что мне также нужны другие строки и дополнительный запрос только для получения последнего элемента, что добавляет слишком много накладных расходов к и без того тяжелому пакету.

Ответ №1:

Задумывались ли вы об этом «базовом» способе выполнения этого (и если это так, то почему он не работает?) :

 ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);

Timestamp ts = null;
while (results.next()) {
    ...
    //I need to extact a timestamp from the last record here
    ts = results.getTimestamp("timestamp_column");
}

// you'll have here ts with the value of the latest row.
// Be careful, it can be null in case of empty result set.
  

Комментарии:

1. Черт, я не думал об этом, я просто перенесу логику, связанную с этой временной меткой, за цикл и продолжу обновлять значение ts каждый раз до конца. Большое вам спасибо.

2. Это считывает каждую запись, хотя вам нужна только последняя. Есть ли лучший способ или вызов .last() также по существу перечисляет весь запрос?

3. @JoshM.yes : измените порядок запроса на обратный, ограничьте 1, захватите строку 🙂