(我的环境:Windows 7 x64和Server 2008,EclipseLink 2.5.2,我已经尝试了下面的JTDS和MS JDBC驱动程序,以及MS SQL Server Express 2008和2012 )EclipseLink生成的SQL不包含分页
我正在做一个分页查询的表格,其中有五千五百万行的任何地方,大约有五百万行符合过滤条件。以下是我用来在UI 25行中一次显示此数据的分页查询。分页工作正常 - 列表中每个页面只包含25行。但是,查询需要24秒才能返回25行,这似乎很长。
我的目标是记录生成的SQL,以便我可以准确了解JPA如何在SQL Server 2008 vs 2012中完成分页。但生成的SQL不包含与分页有关的任何内容,这让我想知道否则我没有在生成的SQL中看到。
查询:
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<RGHICarrierPull> cq = cb.createQuery(RGHICarrierPull.class);
Root<RGHICarrierPull> from = cq.from(RGHICarrierPull.class);
CriteriaQuery<RGHICarrierPull> select = cq.select(from);
// Add filter/sort predicates to "predicates"
...
select.where(predicates);
// Apply pagination
records.setFirstResult((page-1)*limit);
records.setMaxResults(limit);
// Get data
List<RGHICarrierPull> lst = records.getResultList();
要登录编程生成的SQL:
// Log the sql for this query
Session session = JPA.em().unwrap(JpaEntityManager.class).getActiveSession();
DatabaseQuery databaseQuery = ((EJBQueryImpl)records).getDatabaseQuery();
databaseQuery.prepareCall(session, new DatabaseRecord());
System.out.println(databaseQuery.getSQLString());
记录的SQL:
SELECT t1.SHIPTO_ZIP, t1.WHSE, t1.ANYNBR1, t1.ANYTEXT1, t1.CREATE_DATE_TIME, t1.
MOD_DATE_TIME, t1.PULL_TIME, t1.PULL_TIME_AMPM, t1.PULL_TRLR_CODE, t1.USER_ID,
1.SHIP_VIA FROM Ship_Via t0, RGHI_Carrier_Pull t1 WHERE ((t1.WHSE = 'WHSE1') AND
(t0.SHIP_VIA = t1.SHIP_VIA)) ORDER BY t0.SHIP_VIA ASC, t1.SHIPTO_ZIP ASC
很显然,这不是一个分页查询,因此,如果我直接运行这个查询,它运行了一分多钟并返回所有500万行。如果我使用persistence.xml设置来记录所有JPA查询,并且如果我从MS SQL Server登录SQL,则会得到相同的结果。
这是实际生成的SQL吗?我看到两种可能性:
- 这是完全生成的SQL,但EclipseLink正在做其他事情来完成分页。
- 的EclipseLink正在记录此生成的SQL被添加到它之前的分页东西