0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自分用メモ

Posted at

■Userテーブルの最新の血液型を登録

以下を考慮
・COMPANYテーブルに存在するがUSERテーブルに存在しないUSER_IDが引数に指定された場合にnullを登録

【補足】Company.xmlに記載するsqlは以下を考慮した内容にする(CompanySide.xmlについても同様)
・USERテーブルの引数のidを持つ最新のレコードの血液型をCOMPANYテーブルの血液型に設定する。
・USERテーブルに引数のidを持つレコードが存在しない場合は血液型にNULLを登録する。

登録はUPDATE部分がINSERTに変わるイメージ

SQLIdea1.xml
<update id="bulkUpdateCompany">
    <foreach item="item" collection="list" separator=";">
        UPDATE COMPANY
        SET
            name = #{item.name},
            age = #{item.age},
            blood_type = CASE
                WHEN user_id IN (SELECT user_id FROM USER) THEN (
                    SELECT blood_type
                    FROM USER
                    WHERE USER.user_id = COMPANY.user_id
                    AND USER.user_id = #{item.userId}
                    AND USER.upd_time = (
                        SELECT MAX(upd_time)
                        FROM USER
                        WHERE user_id = USER.user_id
                    )
                )
                ELSE NULL
            END
        WHERE user_id = #{item.userId}
    </foreach>
</update>

foreach要素:

collection="list": Javaから渡されたListをループ処理します。
item="item": ループ内の各エンティティをitemという名前で参照します。
separator=";": 各UPDATE文をセミコロンで区切ります。
UPDATE文:

UPDATE COMPANY: COMPANYテーブルを更新します。
SET name = #{item.name}, age = #{item.age}: エンティティのnameとageフィールドの値をCOMPANYテーブルの対応するカラムに設定します。
SET blood_type = CASE ... END: blood_typeカラムの値を条件に応じて設定します。
WHEN user_id IN (SELECT user_id FROM USER) THEN ...: USERテーブルに存在するuser_idの場合、USERテーブルからblood_typeを取得して設定します。
ELSE NULL: USERテーブルに存在しないuser_idの場合、NULLを設定します。
WHERE user_id = #{item.userId}: エンティティのuserIdフィールドの値に基づいて更新対象の行を特定します。

以下は単に検索対象から除外する。

SQLIdea2.xml
<update id="bulkUpdateBloodType">
    UPDATE COMPANY
    SET blood_type = (
        SELECT blood_type
        FROM USER
        WHERE USER.user_id = COMPANY.user_id
        AND USER.user_id IN
        <foreach item="id" collection="idList" open="(" separator="," close=")"> #{id} </foreach>
        AND USER.upd_time = (
            SELECT MAX(upd_time)
            FROM USER
            WHERE user_id = USER.user_id
        )
    )
    WHERE user_id IN
    <foreach item="id" collection="idList" open="(" separator="," close=")"> #{id} </foreach>
    AND user_id IN (
        SELECT user_id
        FROM USER
    )
</update>

USERテーブルの更新の後に実行(登録処理でも同じものを実行)

テーブル名がUSERの場合、以下の処理を実施
()selectUserlist.size()分以下の処理を繰り返し(変数はuser)
()user.getUserIdでuserIdを取得
()取得したidで重複を削除し、idが重複していないidListを作成

dao.insertOrUpdate(UserMapper,"updateBloodType",idList)を実行し、
血液型を更新

idListIdea.java
 List<Integer> distinctUserIdList = userList.stream()
                .map(User::getUserId) // UserオブジェクトからuserIdを抽出
                .distinct() // 重複を削除
                .collect(Collectors.toList()); // リストに変換

【補足】Company.xmlに記載するsqlは以下を考慮した内容にする(CompanySide.xmlについても同様)
・USERテーブルの引数のidを持つ最新のレコードの血液型をCOMPANYテーブルの血液型に設定する。

SQLIdea2.xml
<update id="bulkUpdateBloodType">
    UPDATE COMPANY
    SET blood_type = (
        SELECT blood_type
        FROM USER
        WHERE USER.user_id = COMPANY.user_id
        AND USER.user_id IN
        <foreach item="id" collection="idList" open="(" separator="," close=")"> #{id} </foreach>
        AND USER.upd_time = (
            SELECT MAX(upd_time)
            FROM USER
            WHERE user_id = USER.user_id
        )
    )
    WHERE user_id IN
    <foreach item="id" collection="idList" open="(" separator="," close=")"> #{id} </foreach>
</update>

■HTTPリクエスト
()send以前のエラー→開発段階でしか起こらない

例外が発生した場合、ログを出力 スロー市内

()send以後のエラー→運用で起こりうる
エラーと、HTTPリクエストの失敗をログ出力 スローはしない。

■nepo機能について
*更新するテーブルと登録するテーブルはイコールではないので、
テーブル名を確認するif文が必要 あとは同じ

■eteled機能について
新規登録処理をdeleteに変えればいい。
daoクラスも更新新規のやつをdeleteにする

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?