Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EclipseLink/Examples/JPA/Pagination"
< EclipseLink | Examples | JPA
(→Chunking using PKs with IN) |
(→Database Cursors) |
||
Line 7: | Line 7: | ||
There are a variety of solution options for paging results in an EclipseLink JPA application. This how-to highlights various approaches with code samples of how they can be used. | There are a variety of solution options for paging results in an EclipseLink JPA application. This how-to highlights various approaches with code samples of how they can be used. | ||
− | |||
− | |||
== FirstResult/MaxRows == | == FirstResult/MaxRows == |
Revision as of 22:51, 28 March 2008
Contents
How to use EclipseLink Pagination
There are a variety of solution options for paging results in an EclipseLink JPA application. This how-to highlights various approaches with code samples of how they can be used.
FirstResult/MaxRows
Database Specific SQL
EclipseLink's target database platform enables the generation of native SQL that can more optimally retrieve a set of rows.
Oracle ROWNUM
When the target platform is Oracle then ROWNUM is used in the generated SQL in addition to a hint to retrieve a page of results.
Query query = em .createQuery("SELECT e FROM Employee e ORDER BY e.lastName ASC, e.firstName ASC"); query.setFirstResult(5); query.setMaxResults(5); List<Employee> emps = query.getResultList();
Generates the SQL like:
SELECT * FROM (SELECT /*+ FIRST_ROWS */ a.*, ROWNUM rnum FROM ( SELECT t0.EMP_ID AS EMP_ID1, t1.EMP_ID AS EMP_ID2, t0.F_NAME AS F_NAME3, t0.L_NAME AS L_NAME4, t0.START_TIME AS START_TIME5, t0.END_TIME AS END_TIME6, t0.GENDER AS GENDER7, t1.SALARY AS SALARY8, t0.VERSION AS VERSION9, t0.START_DATE AS START_DATE10, t0.END_DATE AS END_DATE11, t0.MANAGER_ID AS MANAGER_ID12, t0.ADDR_ID AS ADDR_ID13 FROM EMPLOYEE t0, SALARY t1 WHERE (t1.EMP_ID = t0.EMP_ID) ORDER BY t0.L_NAME ASC, t0.F_NAME ASC) a WHERE ROWNUM <= ?) WHERE rnum > ? bind => [10, 5]
Chunking using PKs with IN
This involve performing a query on the database for all of the primary key values that match the criteria and then using these values to retieve specific sets.
Query query = em .createQuery("SELECT e.id FROM Employee e ORDER BY e.lastName ASC, e.firstName ASC"); List<Integer> empIds = query.getResultList(); ReadAllQuery raq = new ReadAllQuery(Employee.class); ExpressionBuilder eb = raq.getExpressionBuilder(); raq.setSelectionCriteria(eb.get("id").in(empIds.subList(5, 10))); List<Employee> emps = JpaHelper.createQuery(raq, em).getResultList();
The SQL generated for this query looks like:
SELECT t0.EMP_ID FROM EMPLOYEE t0, SALARY t1 WHERE (t1.EMP_ID = t0.EMP_ID) ORDER BY t0.L_NAME ASC, t0.F_NAME ASC SELECT t0.EMP_ID, t1.EMP_ID, t0.F_NAME, t0.L_NAME, t0.START_TIME, t0.END_TIME, t0.GENDER, t1.SALARY, t0.VERSION, t0.START_DATE, t0.END_DATE, t0.MANAGER_ID, t0.ADDR_ID FROM EMPLOYEE t0, SALARY t1 WHERE ((t0.EMP_ID IN (?, ?, ?, ?, ?)) AND (t1.EMP_ID = t0.EMP_ID)) bind => [8, 1, 12, 3, 10]