首页 > 解决方案 > 使用 EclipseLink、SQL Server 和 spring 数据进行分页

问题描述

我目前正在尝试找出 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;
}

所以对于每个 bar 和 fooBar 都有一个单独的选择。

现在我想讨论一些解决方案。我目前的建议是。如果找到了很好的可能性,我可以看到它是如何在 spring data 中得到最好的实现的。

  1. 使用带有 IN 的 ID 进行分块
    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 语句而不是单选

  2. 将批处理与 QueryHints IN 或 JOIN 一起使用? https://www.eclipse.org/eclipselink/documentation/2.5/jpa/extensions/q_batch.htm

  3. 另一种可能?

标签: sql-serverspring-data-jpaeclipselink

解决方案


推荐阅读