MySQL/MyBatis |動的クエリの使用


🍞 コンテキスト



これは、A というサービスに対応するテーブルを結合して検索するために使用されます.B サービスと C サービスも後で共通化のために追加されます. A、B、および C サービスはすべて共通化して、単一のクエリで機能できるようにする必要があります.

テーブルに、各サービスに対応する all_hista_requesta_responseb_requestb_responsec_requestc_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 回書いてみようかなと思ったのですが、また気づきました.動的クエリについては後で確認します.

🍊参考


  • 私は英語で文章を書くのが得意ではありませんが、うまくやりたくて努力しています.フィードバックはいつでも大歓迎です.
  • 만약 이 글을 한국어로 읽고 싶다면 MySQL/MyBatis | 동적 쿼리(Dynamic Query) 사용하기 글을 참고해 주세요.