1

複数のクエリがあり、そこでいくつかのタスクを実行します。

例:

<pre>
select * from test 
where something
if check A
if check B
if check C
compare something.
For one table.
</pre>

同様に、さまざまなテーブルに対して他の多くのクエリがあります。

<pre>
select * from test 
where something
if check A
if check B
if check C
compare something.
</pre>

currently i am using reference. 

    select * from test 
    where something

<pre>
&lt;include refId="test"/&gt;
</pre>

<sql id="test">
if check A
if check B
if check C
compare something
</sql>

これを行うには他に良い方法はありますか。また、クエリの戻り値の型はハッシュ マップです。

複数のクエリを記述する代わりに、いくつかの値を列または行の名前として渡し、次のことを実行できる関数またはメソッドを作成できるかどうかを知りたいですか?

詳細情報:実際には、クエリを一度記述し、何度も入力せずにずっと使用する方法を探しています。以前に私は現在参照を使用しています。しかし、別のselectステートメントを使用してからincludeタグを呼び出す必要がない方法を探しています。代わりに、テーブル名または列名を Java コントローラー クラスから xml またはクエリ ファイルに渡すことができる関数を作成したいと考えています。そのため、値を取り込んで、それらの入力を考慮し、それに応じて行動できます。

上記のように、さまざまなテーブルから詳細を実行または取得する必要がありますが、条件はすべてのクエリでほぼ同じです。そのため、選択する場所と選択するものからテーブルを送信できる関数を作成したいのですが、値を渡すことができる条件は一般的である必要があり、すべてに対して作業を行う必要があります。

コード例:

<select id="searchPatientAdmissionByDates" resultType="hashMap" parameterType="hashMap">
    SELECT COUNT(DISTINCT(admission_details.PATIENT_ID)) AS CASECOUNT
    FROM admission_details,patient
    WHERE
    admission_details.PATIENT_ID = patient.id
    <if test="admissionDate !=null">
        AND
        FROM_DATE &gt;= #{admissionDate}
    </if>
    <if test="admissionDateThru !=null">
        AND
        FROM_DATE &lt;= #{admissionDateThru}
    </if>
    <if test="dischargeDate !=null">
        AND
        THRU_DATE &gt;= #{dischargeDate}
    </if>
    <if test="dischargeDateThru !=null">
        AND
        THRU_DATE &lt;= #{dischargeDateThru}
    </if>
</select>

これはクエリであり、いくつかの条件があります。このクエリと同様に、if 条件は同じだがテーブルが異なるクエリが多数あります。そのため、値を渡すことができる関数を作成したいと思います。その関数は、同じ条件を持つすべてのクエリに対して動作する必要があります。

4

1 に答える 1

0

これは、多くの人が解決しようとしている問題です。

私が見た一般的なパターンは、一連のオブジェクト プロパティをチェックして SQL クエリを動的に作成することです。みたいな

UserSearchFilter filter = new UserSearchFlter().
filter.setFirstName("John");
filter.setJobTitle("CFO");

List<User> users = userDao.search(filter);

DAO は単純に、既知の各プロパティに対して if ステートメントを使用し、検出された場合は、それに応じて WHERE 句を追加します。

それは通常、しばらくの間うまくいきます。最終的には、コード内のパスが非常に多くなるため、パフォーマンス チューニングが難しくなります。

場合によっては、特定のフィルターを where 句ではなく、サブクエリまたは内部結合条件を使用して実行するのが最適な場合があります。特定のフィルタ条件が使用されている場合にのみ、条件付きで他のテーブルを結合する必要がある場合があります。場合によっては、WITHファクターを使用して多数のレコードを取り出し、後でクエリでそれらを結合する必要があり、パフォーマンスが向上する場合があります。

このような場合は、条件ごとに個別の固定クエリが必要です。

もちろん、小さな 1 回限りのクエリごとに個別のクエリを作成することは、メンテナンスに悪影響を与える可能性があります。私はこの両方の側にいました。以前はエレガントなコードでしたが、条件の数が原因でスパゲッティコードになったものを解読するのに苦労し、再利用せずにすべての小さな領域で同じ SQL を使用していました。

人生のほとんどのものと同様に、あなたが達成できる健康的なバランスがあります。

于 2013-04-24T12:07:31.327 に答える