2016-03-31 15 views
0

Gibt es ein gutes Beispiel für die Implementierung der Seitennumerierung mit Apache Derby, so dass nicht jedes Mal, wenn eine neue Seite ausgewählt wird, die gesamte Ergebnismenge zurückgegeben wird?Seitennummerierung mit Apache Derby

Es wäre auch hilfreich, wenn die Abfrage nach einer benutzerdefinierten Spalte sortiert werden könnte.

Antwort

1

Dies sind die Derby-Schlüsselwörter, die bei der Umsetzung der Paginierung helfen: OFFSET and FETCH

Beispiel Nutzung:

//all these values are supplied by the GUI 
int rowsPerPage = 10; 
int pageNumber = 3; 
String columnToSortBy = "first_name"; //this value should never be directly edited by the user. Otherwise it could be used for sql injection 

StringBuilder statement = new StringBuilder(); 
statement.append("select * from users\n"); 
statement.append("order by " + columnToSortBy + "\n"); 
statement.append("offset ? rows fetch first ? rows only"); 

try (PreparedStatement ps = conn.prepareStatement(statement.toString())) { 

    ps.setInt(1, pageNumber * rowsPerPage); 
    ps.setInt(2, rowsPerPage); 

    ResultSet rs = ps.executeQuery(); 
    printResultSet(rs); 
} 

ein aufwendigeres Beispiel:

//all these values are supplied by the GUI 
int rowsPerPage = 10; 
int pageNumber = 3; 
String columnToSortBy = "first_name"; //this value should never be directly edited by the user. Otherwise it could be used for sql injection 

String selectClause = "select * from users\n"; 
String whereClause = "where first_name like ?"; 
String orderClause = "order by " + columnToSortBy + "\n"; 
String limitClause = "offset ? rows fetch first ? rows only"; 

//build the sql statement 
String statement = ""; 
statement += selectClause; 
statement += whereClause; 

//get the total rows 
int totalRows = 0; 
try (PreparedStatement ps = conn.prepareStatement(statement)) { 
    ps.setString(1, "Sam%"); 

    ResultSet rs = ps.executeQuery(); 
    while (rs.next()) { 
     totalRows++; 
    } 
} 
System.out.println(totalRows + " total rows\n");   

//change the statement to use pagination 
statement += orderClause; 
statement += limitClause; 

//get the 3rd page 
try (PreparedStatement ps = conn.prepareStatement(statement)) { 

    ps.setString(1, "Sam%"); 
    ps.setInt(2, pageNumber * rowsPerPage); 
    ps.setInt(3, rowsPerPage); 

    ResultSet rs = ps.executeQuery(); 
    printResultSet(rs); 
} 

System.out.println("\nNext page\n"); 

//get the 4th page 
try (PreparedStatement ps = conn.prepareStatement(statement)) { 

    ps.setString(1, "Sam%"); 
    ps.setInt(2, (pageNumber + 1) * rowsPerPage); 
    ps.setInt(3, rowsPerPage); 

    ResultSet rs = ps.executeQuery(); 
    printResultSet(rs); 
} 
+1

Vielen Dank für das gut geschriebene Beispiel! Siehe auch http://stackoverflow.com/questions/19606571/derby-db-sql-select-rows-star-ting-from-row-number/19606655#19606655 –