#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.
- Разбиение на части с использованием идентификаторов с помощью
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();
- Использование инструкции IN для каждого подвыбора (например, hibernate) вместо single select
- Использование пакета с точками запроса или JOIN? https://www.eclipse.org/eclipselink/documentation/2.5/jpa/extensions/q_batch.htm
- Другая возможность?
Комментарии:
1. Если вам нужна поддержка разбивки на страницы для любой платформы — вы можете расширить существующую платформу и переопределить метод printSQLSelectStatement, чтобы использовать то, что вам нужно. То, что вы показали, почти идентично тому, что существует в org.eclipse.persistence.platform.database. Класс DerbyPlatform. Разбивка на страницы с использованием варианта 1 может помочь с точным набором возвращаемых значений 10 объектов, но не поможет с производительностью; вам нужно будет настроить тестовые примеры, которые отражают ваши средние и наилучшие и наихудшие крайние случаи, чтобы определить, что лучше всего подходит для вашего приложения — общие решения для повышения производительности никогда не масштабируются.
2. возможно, вы захотите взглянуть на java-persistence-performance.blogspot.com/2011/06 /… для обсуждения пакетной выборки. Вам все равно понадобятся ваши собственные числа, основанные на вашей модели и вариантах использования, но именно поэтому я рекомендую пакетную выборку вместо объединения, за исключением хорошо известных и ограниченных отношений ToMany.
3. Спасибо, я загляну в сообщение в блоге.