バッチ追加の方法を書いた:
INSERT INTO CRD_SUBSIDY_AMOUNT (
id,
DELETED,
CREATED_BY,
CREATED_DATE,
ORGANIZATION_ID,
REMARK,
SUBSIDY_GRANT_AMT,
MONTH_OF_YEAR,
SURPLUS_AMT,
USED_AMT,
AMOUNT_ID,
ALLOW_USED_SUBSIDY_AMT,
STAFF_ID,
STAFF_NAME
)
VALUES
<foreach collection='subsidyAmounts' item='item' index='index' separator=','>
(
#{ item.id },
#{ item.del },
#{ item.createdBy },
#{ item.createdDate },
#{ item.organizationId },
#{ item.remark } ,
#{ item.subsidyGrantAmt },
#{ item.monthOfYear },
#{ item.surplusAmt },
#{ item.usedAmt },
#{ item.amountId },
#{ item.allowUsedSubsidyAmt },
#{ item.staffId },
#{ item.staffName }
)
</foreach>
実行中に理由もなくエラーを報告する
SQLが正しく終了しなかったとしましょう。
後で、これがMysqlのSQLであることがわかりました
SQLを変更しました
INSERT INTO CRD_SUBSIDY_AMOUNT (
id,
DELETED,
CREATED_BY,
CREATED_DATE,
ORGANIZATION_ID,
REMARK,
SUBSIDY_GRANT_AMT,
MONTH_OF_YEAR,
SURPLUS_AMT,
USED_AMT,
AMOUNT_ID,
ALLOW_USED_SUBSIDY_AMT,
STAFF_ID,
STAFF_NAME
)
SELECT A.*
FROM(
<foreach collection="list" item="item" index="index" separator="UNION ALL">
SELECT
#{ item.id,jdbcType=VARCHAR } id,
#{ item.del ,jdbcType=NUMBER} DELETED,
#{ item.createdBy,jdbcType=VARCHAR } CREATED_BY,
#{ item.createdDate,jdbcType=TIMESTAMP} CREATED_DATE,
#{ item.organizationId,jdbcType=VARCHAR } ORGANIZATION_ID,
#{ item.remark,jdbcType=VARCHAR } REMARK,
#{ item.subsidyGrantAmt,jdbcType=VARCHAR } SUBSIDY_GRANT_AMT,
#{ item.monthOfYear,jdbcType=VARCHAR } MONTH_OF_YEAR,
#{ item.surplusAmt ,jdbcType=VARCHAR} SURPLUS_AMT,
#{ item.usedAmt,jdbcType=VARCHAR } USED_AMT,
#{ item.amountId ,jdbcType=VARCHAR} AMOUNT_ID,
#{ item.allowUsedSubsidyAmt,jdbcType=VARCHAR } ALLOW_USED_SUBSIDY_AMT,
#{ item.staffId,jdbcType=VARCHAR } STAFF_ID,
#{ item.staffName,jdbcType=VARCHAR } STAFF_NAME
FROM dual
</foreach>
)A
実行後、エラーが報告されました:
マッパーメソッド 'xxx'にサポートされていない戻り値の型があります
この種類のエラーは、SQLステートメントは正常に実行されたが、戻り値の型が間違っていることを示しています。
解決:
挿入、削除、更新操作は、デフォルトでint型の整数を返します。追加、削除、および変更のインターフェースをintまたはvoidに変更できます。
選択操作によって返されるタイプは、カスタムのマップまたはリストにすることができます
戻り値の型を変更するだけです。
その後、私はバッチ修正を書きました:
<foreach collection='list' item='item' index='index' open='begin'
close=';end;' separator=';'>
update CRD_SUBSIDY_AMOUNT t
set
t.ALLOW_USED_SUBSIDY_AMT=#{item.allowUsedSubsidyAmt},
t.LAST_MODIFIED_BY='system',
t.LAST_MODIFIED_DATE=sysdate
where t.STAFF_ID = #{item.staffId}
</foreach>
ps:これはOracleデータベースであるため、now()関数は新規および変更された時間フィールドには使用できません。そのため、sysdate関数が記述されています。