(我的环境:Windows 7 x64和Server 2008中,的EclipseLink 2.5.2,我已经试过JTDS和MS JDBC驱动程序下面,并与MS SQL Server Express的2008年和2012年)
我做在5-50万行的任何地方表中的分页查询,有大约500万行符合过滤条件。 以下是我使用的同时,以在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服务器的SQL。
这是实际生成的SQL? 我看到两种可能性:
- 这是一个完整生成的SQL,但在的EclipseLink做别的事情来实现分页。
- 的EclipseLink正在记录此生成的SQL被添加到它之前的分页东西