setHint(QueryHints.HINT_FETCH_SIZE, ?) в hibernate

134
15 октября 2018, 13:40

Решил почитать один блог

https://vladmihalcea.com/whats-new-in-jpa-2-2-stream-the-result-of-a-query-execution/

В нем рассказывается о том как извлечь часть данных из бд в том числе при помощи setHint(QueryHints.HINT_FETCH_SIZE, ?). И у меня возникли вопросы по поведению примеров.

В этом примере у поведение легко прогнозируемо, мы получим все строки и возьмем часть от них:

List<Post> posts = doInJPA(entityManager -> {
        try (Stream<Post> postStream = entityManager
                .createQuery(
                        "select p " +
                                "from Post p " +
                                "order by p.createdOn desc", Post.class)
                .unwrap(Query.class)
                .stream()
        ) {
            return postStream.limit(50).collect(Collectors.toList());
        }
    });

Но в этом примере поведение не понятно.

List<String> executionPlanLines = doInJPA(entityManager -> {
            try (Stream<String> postStream = entityManager
                    .createNativeQuery(
                            "EXPLAIN ANALYZE " +
                                    "SELECT p " +
                                    "FROM post p " +
                                    "ORDER BY p.created_on DESC")
                    .setHint(QueryHints.HINT_FETCH_SIZE, 50)
                    .unwrap(Query.class)
                    .getResultStream()
            ) {
                return postStream.collect(Collectors.toList());
            }
        });

В результате будем иметь следующий план запроса.

Execution plan: Sort  (cost=65.53..66.83 rows=518 width=564) (actual time=5.690..6.013 rows=5000 loops=1)
  Sort Key: created_on
  Sort Method: quicksort  Memory: 850kB
  ->  Seq Scan on post p  (cost=0.00..42.18 rows=518 width=564) (actual time=0.024..1.725 rows=5000 loops=1)

Почему он выбирает все 5000 и при этом игнорирует setHint(QueryHints.HINT_FETCH_SIZE, 50)?

READ ALSO
Как передать ресурс из одного фрагмента в другой?

Как передать ресурс из одного фрагмента в другой?

В одном фрагменте есть кнопки, по нажатию которых открывается другой

147
Как вывести AlertDialog?

Как вывести AlertDialog?

Мне надо по нажатию на кнопку в быстрых настройках (Tileservice) открыть AlertDialog, но его не открыть без активити, мне не надо, чтобы открывалось активити,...

153
Numeric overflow in expression при складывании String

Numeric overflow in expression при складывании String

С одним все работает, если сложить, то не хочет

174
Как скрыть часть текста или весь в TextView?

Как скрыть часть текста или весь в TextView?

В TextView у меня выводится несколько строковых ресурсов:

158