MySQL/MyBatis |動的クエリの使用
🍞 コンテキスト
これは、A というサービスに対応するテーブルを結合して検索するために使用されます.B サービスと C サービスも後で共通化のために追加されます. A、B、および C サービスはすべて共通化して、単一のクエリで機能できるようにする必要があります.
テーブルに、各サービスに対応する
all_hist
、 a_request
、 a_response
、 b_request
、 b_response
、 c_request
、 c_response
があるとします.🥫解決策
DTO
にフラグを立てる変数がある場合は、SQL ステートメントの FROM
句で変数をチェックする条件を追加できます. ReqDTO
に、フラグとして機能する type
という変数があるとします.以下に示すように、 <choose>
句で <when>
、 From
を使用できます.SELECT *
FROM all_hist ah
<choose>
<when test="type != null and type == 'A_REQUEST'">
, a_request areq, a_response ares
</when>
</choose>
修正前後のコードと比較してみます.
前
<select id="selectList" parameterType="ReqDTO" resultType="ResDTO">
/* allHist.selectList */
SELECT ah.id AS id,
areq.name AS name,
ares.ymdt AS ymdt
FROM all_hist ah, a_request areq, a_response ares
WHERE ah.id = areq.id
AND areq.id = ares.id
AND ah = #{id}
AND ah.type = #{type}
ORDER BY id DESC
</select>
後
<select id="selectList" parameterType="ReqDTO" resultType="ResDTO">
/* allHist.selectList */
SELECT ah.id AS id,
areq.name AS name,
ares.ymdt AS ymdt
FROM all_hist ah
<choose>
<when test="type != null and type == 'A_REQUEST'">
, a_request areq, a_response ares
</when>
</choose>
WHERE ah.id = areq.id
AND areq.id = ares.id
AND ah = #{id}
AND ah.type = #{type}
ORDER BY id DESC
</select>
BとCを追加すると以下のようなコードになります.
SELECT *
FROM all_hist ah
<choose>
<when test="type != null and type == 'A_REQUEST'">
, a_request areq, a_response ares
</when>
<when test="type != null and type == 'B_REQUEST'">
, b_request areq, b_response ares
</when>
<when test="type != null and type == 'B_REQUEST'">
, c_request areq, c_response ares
</when>
</choose>
🍮回顧
WHERE
セクションで動的クエリの使用を見たことがありますが、FROM
セクションではめったに見ないので、迷っていました.同僚から説明を聞くまで、私は理解できませんでした.キーワード Dynamic Query
はなじみがなく、あまりよく使っていなかったので知りませんでした.最初は、A、B、C に対応する DAO
を 3 回書いてみようかなと思ったのですが、また気づきました.動的クエリについては後で確認します.🍊参考
Reference
この問題について(MySQL/MyBatis |動的クエリの使用), 我々は、より多くの情報をここで見つけました https://dev.to/yian/mysqlmybatis-using-dynamic-query-51boテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol