sql-server - 使用 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 中得到最好的实现的。
- 使用带有 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();
对每个子选择(如休眠)使用 IN 语句而不是单选
将批处理与 QueryHints IN 或 JOIN 一起使用? https://www.eclipse.org/eclipselink/documentation/2.5/jpa/extensions/q_batch.htm
另一种可能?
解决方案
推荐阅读
- node.js - 如何进行有条件的 https 请求?
- sql - 查看 PL SQL 中的 IF、WHERE 和 WHEN
- jquery - 弹出表单返回 404 而不是更新 DataTables 行
- javascript - JQuery 不删除类
- python - 在 numpy 中向量化这个 for 循环
- c# - 输入无效输入时,Tryparse 未使用 else 语句
- r - 在保持列完整性的同时使用 unlist
- python-3.x - python:ProcessPoolExecutor 分块处理
- c# - ASP.NET MVC 调用控制器方法 DevExpress
- java - Java 中的动态流