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!
, и они делают именно это: извлекают все и возвращают запрашиваемую страницу. Естественно, каждый раз, когда запрашивается новая страница.