0

Webサイト(Struts 2で作成)の高度な検索モジュールを実現しました。この検索領域は、さまざまなフィールドを持つフォームです。選択に応じて異なる結果を得るフィールドのすべて、一部、またはまったく文字列を入れることができます。私が今していることは、空白のフィールド(およびどれ)があるかどうかを大きな悪いif / elseifステートメントで確認してから、正しい方法を適用することです。

    if (field_1.equals("") && field_2.equals("")) {
        dao.searchAll;
    } else if (field_1.equals("") && !field_2.equals("")) {
        dao.searchType1;
    } else if (!field_1.equals("") && !field_2.equals("")) {
        dao.searchType2;
    } else if {
       ...
       ...

daoのメソッドはHQL(休止状態)クエリです。

この例は、5つのテキスト入力フィールドがある私の場合よりも単純です。

同じことを行うためのより良い柔軟な方法はありますか?ストラテジーのようなデザインパターン?

4

2 に答える 2

1

ストラットは本当に弱いです。最初に注意することは、動作をインターフェイスコンポーネントに直接結び付けないことです。JSFでは、これらのフィールドをクラスのプロパティにバインドし、そこからそれらを参照します(クエリディスパッチを具体化するコンポーネントは、入力ソースについて何も知らないはずです)。

ディスパッチャは基本的にここにあるものです。特定のメッセージが受信されると、特定の応答をトリガーします。値を不変の形式に変換してから、ファクトリメソッドを作成して適切なクエリをフェッチまたは作成します。次に、ファクトリコンストラクトの外部で実行します。

それは戦略ではありません。何をすべきかを理解するさまざまな方法がありますが、これは創造的な問題です。入力の断片をクエリに変換しているのです。

于 2013-01-16T16:17:28.603 に答える
0

HibernateCriteriaAPIを見てください。これを使用して、フィールドに基づいてクエリを作成できます。したがって、たとえば、次のように書くことができます。

Criteria criteria = session.createCriteria(Some.class);
if (!field_1.equals("")) {
  criteria.add( /*some criteria for field_1 */ );
}
if (!field_2.equals("")) {
  criteria.add( /*some criteria for field_2 */ );
}
于 2013-01-16T15:34:54.773 に答える