Разбивка на страницы с помощью EclipseLink, SQL Server и spring data

#sql-server #spring-data-jpa #eclipselink

#sql-сервер #spring-data-jpa #eclipselink

Вопрос:

В настоящее время я пытаюсь выяснить, какой наилучший вариант разбивки на страницы с помощью EclipseLink и SQL Server.

Я видел, что для SQL Server нет специальной поддержки разбивки на страницы с помощью EclipseLink. Если у меня есть следующая модель данных, findAll создает набор select (n 1) для каждого элемента. На первый взгляд это не выглядит эффективным.

 public class Foo {
   @OneToMany( fetch = FetchType.LAZY )
   private Set<Bar> bars = Sets.newHashSet();
}

public class Bar {
   @OneToMany( fetch = FetchType.LAZY )
   private Set<FooBar> fooBars = Sets.newHashSet();
}

public class FooBar {
   String name;
}
 

Таким образом, для каждого бара и fooBar есть отдельный выбор.

Теперь я хотел бы обсудить несколько решений. Мои текущие предложения таковы. Если была найдена хорошая возможность, я могу посмотреть, как это лучше всего реализовать в spring data.

  1. Разбиение на части с использованием идентификаторов с помощью
     Query query = em.createQuery("SELECT f.id FROM Foo f ORDER BY f.id OFFSET 10 ROWS FETCH NEXT 
    10 ROWS ONLY");
    List<Integer> ids = query.getResultList();
     
    Query query = em.createQuery("SELECT DISTINCT f FROM foo f"
                   " LEFT JOIN FETCH f.bar bars "
                   " LEFT JOIN FETCH bar.fooBars foobars "
                   " WHERE t.id in (:ids) " )
    query.setParameter("ids", ids.subList(5, 10));
    List<Foo> foos = query.getResultList();
 
  1. Использование инструкции IN для каждого подвыбора (например, hibernate) вместо single select
  2. Использование пакета с точками запроса или JOIN? https://www.eclipse.org/eclipselink/documentation/2.5/jpa/extensions/q_batch.htm
  3. Другая возможность?

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

1. Если вам нужна поддержка разбивки на страницы для любой платформы — вы можете расширить существующую платформу и переопределить метод printSQLSelectStatement, чтобы использовать то, что вам нужно. То, что вы показали, почти идентично тому, что существует в org.eclipse.persistence.platform.database. Класс DerbyPlatform. Разбивка на страницы с использованием варианта 1 может помочь с точным набором возвращаемых значений 10 объектов, но не поможет с производительностью; вам нужно будет настроить тестовые примеры, которые отражают ваши средние и наилучшие и наихудшие крайние случаи, чтобы определить, что лучше всего подходит для вашего приложения — общие решения для повышения производительности никогда не масштабируются.

2. возможно, вы захотите взглянуть на java-persistence-performance.blogspot.com/2011/06 /… для обсуждения пакетной выборки. Вам все равно понадобятся ваши собственные числа, основанные на вашей модели и вариантах использования, но именно поэтому я рекомендую пакетную выборку вместо объединения, за исключением хорошо известных и ограниченных отношений ToMany.

3. Спасибо, я загляну в сообщение в блоге.