Spring Data Hibernate: проблема N + 1 и разбиение на страницы - PullRequest
0 голосов
/ 20 февраля 2020

TL; DR - я не могу найти способ решить проблему N + 1, одновременно делая нумерацию страниц.

Мои объекты:

@Entity
public class Invoice {

    @Id
    @JsonView(InvoiceView.ShortView.class)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private UUID id;

// other stuff

    @OneToMany(targetEntity = InvoiceItem.class)
    @JoinColumn(name = "invoice")
    private List<InvoiceItem> items;
}

@Entity
public class InvoiceItem {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private UUID id;

// other stuff
}

Мой репозиторий:

    @EntityGraph(attributePaths = {"vendor","items"})
    @Query(value = "select i from Invoice i where i.status=:status")
    Page<Invoice> getInvoicesWithItemsByStatus(@Param("status") Status status, Pageable pageSpec);

или

        @Query(value = "select i from Invoice i join fetch i.items join fetch i.vendor where i.status=:status",
            countQuery = "select count(i) from Invoice i where i.status=:status")
    Page<Invoice> getInvoicesWithItemsByStatus(@Param("status") Status status, Pageable pageSpec);

Оба из них выдают это предупреждение Hibernate:

HHH000104: firstResult/maxResults specified with collection fetch; applying in memory!

, и они делают именно это: извлекают все и возвращают запрашиваемую страницу. Естественно, каждый раз, когда запрашивается новая страница.

1 Ответ

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

Ваша проблема и способы ее решения описаны в этой статье Владом Михалчеа

https://vladmihalcea.com/fix-hibernate-hhh000104-entity-fetch-pagination-warning-message/

По сути, вам нужно написать собственный запрос.

...