2011-11-19 55 views
0

我想將排序添加到由Hibernate填充的HTML表中。實際的分類必須由數據庫完成。要將「Order by」條件提供給數據庫,Java必須將傳遞的排序參數與查詢中的列進行匹配。我不確定如何實現此匹配。Java中的可排序HTML表

我可以傳遞類似「Employee.salary」的內容,但是這個條件需要像從客戶端傳遞的所有參數一樣檢查。這個檢查需要從Hibernate註釋中獲取列名,我猜這不容易。此外,該列可以是查詢特定的並且不對應於表字段。

另一種方法是在表示層中使用硬編碼值。但是這會將表示層與持久層綁定,這也是我認爲不好的。

如何處理Web應用程序中的服務器端排序?

回答

1

如果我有一個Employee實體的話,我希望有一個EmployeeRepository,讓我findEmployeesBySalary(SortType sortType, int skip, int limit)

從Web服務端,我想要一個URI像

foo.com/employees?by=salary&skip=10&limit=50 

返回類似的信息(如一個AJAX調用XHR)

<employees> 
    <employee uri="/employee/1" /> 
    <employee uri="/employee/2" /> 
    <employee uri="/employee/3" /> 
</employees> 

或成熟的HTML頁面呈現適當。

這很方便地允許在客戶端(緩存大小是靈活的)和HTTP級別對員工進行緩存。

請注意,列名?無關緊要。根據需要,您將有一個HiberateEmployeeRepository實現EmployeeRepository接口。將這些東西表達爲方法,並根據需要使用複雜的參數。

如果你願意,甚至可以有兩種獨立的方法,而不是枚舉,findHighestPaidEmployeesfindLowestPaidEmployees - foo.com/employees?salary=lowest&skip=10&take=30請注意,這是一個非常令人沮喪的URI。

+0

在我的理解SortType枚舉是服務層API的一部分。因此,Web控制器必須從URI參數轉換爲SortType枚舉 –

+0

是的,或者如果您有不同的方法,調用哪種方法。當我使用JAX-RS/Jersey時,我可以通過一個帶String或ValueOf工廠的構造函數自動將URI路徑或查詢parmaters編組爲對象。 –

0

您可以在客戶端對數據進行排序,並有各種js工具的幫助。這將是最小化對數據庫的請求

+0

我想使其具有可擴展性,客戶端排序不適用於大數據。 –

+0

分頁+排序在我的應用程序中工作正常:) –

+0

對於StackOverflow客戶端排序不起作用 –

3

您必須創建某種中間層,以在視圖和表之間映射列名稱。通過這種方式,您可以以封裝的形式向查詢發送額外的參數,並且可以在服務器端代碼中根據實際查詢使用它們。 對於分揀折騰這樣的:

public class ColumnMapping { 
    String tableColName; 
    String dbColName; 
    //getters, setters, ctors and anything else required 
} 
List<ColumnMapping > orderColumns = new ArrayList<ColumnMapping >(); 
orderColumns.add(new ColumnMapping("foo", "bar")); 

//... server side 
StringBuilder queryString = new StringBuilder("select * from books "); 
if(orderingApplicable) { 
    queryString.appendd("order by "); 
    queryString.append(implode(orderColumns, ", ")); 
} 

凡破滅是一個理論上的功能粘合用逗號分隔列表中的元素轉換爲字符串。
備註:
如果不可變,您可以在啓動時輕鬆預先填充view-db映射。
同樣可以爲羣組完成。
這只是一個存根,而是擴展到包括集合函數或任何你需要