2011-11-19 16 views
0

Hibernateによって設定されたHTMLテーブルに並べ替えを追加したいと思います。実際の並べ替えは、データベースによって行われなければなりません。 「Order by」条件をデータベースに供給するためにJavaでは、渡されたソートパラメータをクエリの列に一致させる必要があります。このマッチングの実装方法は不明です。Javaでソート可能なHTMLテーブル

"Employee.salary"のようなものを渡すことができますが、この条件はクライアントから渡されたすべてのパラメータのようにチェックする必要があります。このチェックでは、Hibernateアノテーションからカラム名を取得する必要があります。これは簡単ではありません。また、列は問合せ固有であり、表フィールドに対応していない可能性があります。

もう1つの方法は、プレゼンテーション層でハードコードされた値を使用することです。しかし、これはプレゼンテーションレイヤーをパーシスタンスレイヤーと結びつけることになります。

ウェブアプリケーションでのサーバーサイドのソートをどのように扱いますか?

答えて

1

を必要とするものは何でも、私は、Webサービス側から私にfindEmployeesBySalary(SortType sortType, int skip, int limit)

をすることができますEmployeeRepositoryをしたいです

<employees> 
    <employee uri="/employee/1" /> 
    <employee uri="/employee/2" /> 
    <employee uri="/employee/3" /> 
</employees> 
(AJAXのXHRコールなど)のようなものを返す
foo.com/employees?by=salary&skip=10&limit=50 

のようなURIをしたいです

または本格的なHTMLページが適切に表示されます。

これは、クライアント側(柔軟なキャッシュサイズ)とHTTPレベルでの従業員のキャッシュを便利にします。

列名は?無関係。必要に応じてEmployeeRepositoryインターフェイスを実装するHiberateEmployeeRepositoryがあります。メソッドとしてこのことを表現し、必要に応じて複雑なパラメータを使用します。

列挙型ではなく、必要に応じて2つの別々のメソッドを使用することもできます。findHighestPaidEmployeesfindLowestPaidEmployees-気になります。恐ろしくうつ病のURIです。

+0

をソート行うために、クライアントにすべてのデータを転送する必要性をソートするクライアント側は、サービス層のAPIの一部でありながら、サーバー側のソートを必要とします。そのため、WebコントローラはURIパラメータからSortType列挙型に変換する必要があります –

+0

はい、これは、または異なるメソッドがある場合は、どのメソッドを呼び出すかです。 JAX-RS/Jerseyを使用すると、URIパスまたはクエリparmatersを、StringまたはvalueOfファクトリを受け取るコンストラクタを介して自動的にオブジェクトにマーシャリングすることができます。 –

0

さまざまなjsツールを使用して、クライアント側でデータをソートすることができます。データベースへの要求を最小限に抑える

+0

スケーラブルにしたいのですが、大規模なデータに対してクライアント側のソートは機能しません。 –

+0

ページネーション私は改ページして、クライアントサイドのソートは2つの競合する技術だと思う –

+0

StackOverflowのクライアント側のソートのために微細なソート作品を+。ページネーションを低減し、データ転送を目指して、私の理解SORTTYPE列挙型で –

3

ビューとテーブルの間の列名をマップする何らかの中間層を作成する必要があります。この方法で、追加のパラメータをカプセル化されたフォームでクエリに送信できます。また、サーバーサイドのコードでは、実際のクエリに応じてパラメータを使用できます。このようSTHんソートするための :

破は文字列にカンマでリスト要素を接着理論的な機能である
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マッピングを簡単に事前に設定できます。
グループ別でも同じことができます。
私は、これは単なるスタブですが、集約関数を含むように拡張性がまたは私はEmployeeエンティティを持っている場合は、

関連する問題