SQL语句中 如何使用if test来判断某字段是否在list中

发布于 2022-09-30 23:09:47 字数 1690 浏览 40 评论 0

背景:
编程语言:java ORM框架:mybatis 和 mybatis-plus

场景描述:

现在需要做一个批量更新的方法,方法传入两个参数:list和fieldNamesList

list是schoolDO对象的List集合,里面是待更新的数据,主键是dataId
schoolDO{

private Long dataId; // 主键
private String schoolNo; // 学校编码
private Integer schoolRank; // 学校排名
private String schoolName; // 学校名称

}
fieldNamesList是对应字段名的字符串
fieldNamesList = ["dataId","schoolNo","schoolRank"];

现在我只想更新schoolNo和schoolRank,根据主键dataId进行更新
如何进行动态sql实现?

我的想法是
dao层java代码方法是

int batchUpdateById(
    @Param("entityList") List<SchoolDO> entityList, 
    @Param("fieldNamesList") List<String> fieldNamesList);

XML文件上这么写(下面是伪代码,因为不会写):

    <!-- 批量插入 -->
    <update id="batchUpdateById">
        <foreach collection="entityList" item="entity" index="index1" open="(" close=")" separator=";">
            update  school_info
            <foreach collection="fieldNamesList" item="fieldName" index="index2" open="(" close=")" separator=",">
                   <if test="test里面判断具体字段是否包含fieldNamesList, 也就是是否和fieldName相等">
                set schoolNo = #{entity.getSchoolNo}
                </if>
                <if test="test里面判断具体字段是否包含fieldNamesList, 也就是是否和fieldName相等">
                set schoolRank = #{entity.getSchoolRank}
                </if>
            </foreach>
            where dataId = #{entity.dataId}
        </foreach>
    </update>

这个是我的想法,不知道有没有大佬知道更好的方法,mytais-plus的批量插入对null的字段不起作用,我这边的需求是,如果是明确在fieldNamesList中的就算是null,也要更新到DB表中,所以不太合适,如果有知道mybatis-plus也能满足需求的,也可以回答

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

柠栀 2022-10-07 23:09:47

或许你要的是不是:

<update id="batchUpdateById">
    <foreach collection="entityList" item="entity" index="index1" open="(" close=")" separator=";">
        UPDATE school_info SET
        <if test='fieldNamesList.contains("schoolNo")'>
            schoolNo = #{entity.getSchoolNo}
        </if>
        <if test='fieldNamesList.contains("schoolRank")'>
            schoolRank = #{entity.getSchoolRank}
        </if>
        where dataId = #{entity.dataId}
    </foreach>
</update>

希望你帮助到你。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文