2016-09-11 6 views
2

Ich habe Probleme bei der Implementierung der Seitennummerierung in einer JavaEE-Webanwendung mit EclipseLink.JPQL EclipseLink Seitennummerierung

Die Zieleinheit:

@Entity 
@JsonIdentityInfo(generator=JSOGGenerator.class) 
@NamedQueries({ 
    @NamedQuery(
     name = Project.QUERY_FIND_FOR_ADMIN, 
     query = "SELECT DISTINCT p " + 
       "FROM Project p " + 
       "LEFT JOIN FETCH p.documents " + 
       "LEFT JOIN FETCH p.projectManager " + 
       "LEFT JOIN FETCH p.watchingUsers " + 
       "LEFT JOIN FETCH p.users " + 
       "LEFT JOIN FETCH p.scheme " + 
       "ORDER BY p.id", 
     hints = { 
      @QueryHint(name = QueryHints.LEFT_FETCH, value = "p.documents.states") 
//   ,@QueryHint(name = QueryHints.JDBC_FETCH_SIZE, value = Project.ITEMS_PER_PAGE) // does not change anything 
//   ,@QueryHint(name = QueryHints.JDBC_MAX_ROWS, value = Project.ITEMS_PER_PAGE) // results in a LIMIT statement 
     } 
    ) 
}) 
public class Project extends BaseEntity { 

    public static final String ITEMS_PER_PAGE = "" + 2; 

    ... 
} 

A BaseDAO

public abstract class BaseEntityDAO<Entity> extends AbstractDAO { 

    ... 

    protected List<Entity> executeQuery(String queryName, Map<String, ?> parameters, final int firstResult) { 
     TypedQuery<Entity> query = prepareQuery(queryName, parameters); 
     query.setFirstResult(firstResult); 
     query.setMaxResults(Integer.parseInt(Project.ITEMS_PER_PAGE)); 
     return query.getResultList(); 
    } 

} 

Das in den folgenden Abfragen ergibt:

// Logging 
[2016-09-11T13:16:26.141+0200] [glassfish 4.1] [INFO] [] [] [tid: _ThreadID=28 _ThreadName=Thread-8] [timeMillis: 1473592586141] [levelValue: 800] [[ 
    page: 1]] 
// Logging 
[2016-09-11T13:16:26.141+0200] [glassfish 4.1] [INFO] [] [] [tid: _ThreadID=28 _ThreadName=Thread-8] [timeMillis: 1473592586141] [levelValue: 800] [[ 
    first row: 0]] 

[2016-09-11T13:16:26.143+0200] [glassfish 4.1] [FINE] [] [org.eclipse.persistence.session./file:/Users/timtoheus/NetBeansProjects/discanno/target/swan-2.0/WEB-INF/classes/_SwanPU.sql] [tid: _ThreadID=32 _ThreadName=http-listener-1(5)] [timeMillis: 1473592586143] [levelValue: 500] [[ 
    SELECT DISTINCT t1.ID, t1.Name, t1.CREATOR_ID, t1.COLORSCHEME_ID, t0.ID, t0.Name, t0.TOKENIZATIONLANG, t0.Scheme FROM SCHEME t1 LEFT OUTER JOIN PROJECT t0 ON (t0.Scheme = t1.ID)]] 

[2016-09-11T13:16:26.144+0200] [glassfish 4.1] [FINE] [] [org.eclipse.persistence.session./file:/Users/timtoheus/NetBeansProjects/discanno/target/swan-2.0/WEB-INF/classes/_SwanPU.sql] [tid: _ThreadID=28 _ThreadName=http-listener-1(1)] [timeMillis: 1473592586144] [levelValue: 500] [[ 
    SELECT DISTINCT t1.ID AS a1, t1.Name AS a2, t1.TOKENIZATIONLANG AS a3, t1.Scheme AS a4, t0.ID AS a5, t0.Name AS a6, t0.Text AS a7, 
    t0.project_fk AS a8, t2.ID AS a9, t2.Completed AS a10, t2.LastEdit AS a11, t2.document_fk AS a12, t2.user_fk AS a13, 
    t3.ID AS a14, t3.CreateDate AS a15, t3.EMail AS a16, t3.Lastname AS a17, t3.Password AS a18, t3.Prename AS a19, t3.Role AS a20, 
    t3.session AS a21, t4.ID AS a22, t4.CreateDate AS a23, t4.EMail AS a24, t4.Lastname AS a25, t4.Password AS a26, t4.Prename AS a27, 
    t4.Role AS a28, t4.session AS a29, t5.ID AS a30, t5.CreateDate AS a31, t5.EMail AS a32, t5.Lastname AS a33, t5.Password AS a34, 
    t5.Prename AS a35, t5.Role AS a36, t5.session AS a37, t6.ID AS a38, t6.Name AS a39, t6.CREATOR_ID AS a40, t6.COLORSCHEME_ID AS a41 F 
    ROM PROJECT t1 LEFT OUTER JOIN DOCUMENT t0 ON (t0.project_fk = t1.ID) 
    LEFT OUTER JOIN STATE t2 ON (t2.document_fk = t0.ID) 
    LEFT OUTER JOIN (PROJECTS_MANAGER t7 JOIN Users t3 ON (t3.ID = t7.MANAGER_ID)) ON (t7.PROJECT_ID = t1.ID) 
    LEFT OUTER JOIN (PROJECTS_WATCHINGUSERS t8 JOIN Users t4 ON (t4.ID = t8.WATCHINGUSER_ID)) ON (t8.PROJECT_ID = t1.ID) 
    LEFT OUTER JOIN (USERS_PROJECTS t9 JOIN Users t5 ON (t5.ID = t9.USERS_ID)) ON (t9.PROJECT_ID = t1.ID) 
    LEFT OUTER JOIN SCHEME t6 ON (t6.ID = t1.Scheme) 
    ORDER BY t1.ID 
    LIMIT ? OFFSET ? 
    bind => [2, 0]]] 
// Logging 
[2016-09-11T13:16:28.885+0200] [glassfish 4.1] [INFO] [] [] [tid: _ThreadID=28 _ThreadName=Thread-8] [timeMillis: 1473592588885] [levelValue: 800] [[ 
    number of results: 1]] 

Wie Sie die Abfrage sehen Verwendung von LIMIT macht und OFFSET und bindet die gewünschten Parameter richtig, aber immer das gleiche Ergebnis, egal was die Seite/OFFSET Parameter ist. Es gibt immer "Project1" zurück, aber es gibt insgesamt 6 Projekte in der Datenbank (pgAdmin und IntelliJ können dies nachweisen). Das Ändern von ORDER BY zu Name/ID oder das Erhöhen von "Project.ITEMS_PER_PAGE" ändert nichts. Das gewünschte Verhalten sollte die Anzahl der Zeilen zurückgeben, die als "Project.ITEMS_PER_PAGE" deklariert sind, und nicht immer eins. Ich möchte vermeiden, eine native SQL-Abfrage zu schreiben.

Wie hier aufgeführten PostgreSQL sollte von Eclipselink unterstützt: https://www.eclipse.org/eclipselink/documentation/2.6/concepts/app_tl_ext001.htm

die Ausdrücke 'LIMIT', 'FETCH FIRST ROWS' und 'OFFSET' durch JPQL nicht unterstützt. Ich habe auch einige QueryHints wie oben beschrieben ausprobiert. Das komische Ding ist, dass, wenn ich die Abfrage manuell in Postgres ausführe, es die gewünschte Menge von Ergebnissen richtig zurückgibt.

Ich hoffe, jemand kann mir einen Hinweis geben.

Umwelt: 4.1 Glassfish, PostgreSQL ~ 9.3, Eclipse 2.6.2

Antwort

1

Versuchen linkes Außen Entfernen verbindet - sie wirklich mit Paginierung nicht funktionieren, wie Paginierungsoptionen auf Zeilenebene ist, während Outer-Joins über ManyToMany-Beziehungen erhöhen die Anzahl der Zeilen, die zum vollständigen Lesen einer Entität erforderlich sind. Dies führt wahrscheinlich dazu, dass sich Ihre Entity über mehrere Zeilen erstreckt. Wenn Sie also nach der nächsten "Entity" fragen, erhalten Sie nur die nächste Zeile, die für die gleiche erste Entity gilt.

Try Charge mit liest auf ManyToMany und OneToMany Beziehungen, wenn Paginierung stattdessen verwenden, unter Verwendung eines query hint oder annotation auf der Kartierungs

+0

Ahhh, interessant! Vielen Dank! Ich werde das versuchen. – Rooky