关于#mybatis#的问题,如何解决?

mybatis映射问题!

例:有2张表 tab_a,tab_b映射2个pojo实体分别为a,b; 一对多关系;a 实体中有属性 id, code, name, list,b实体中有属性 id,pid,txt ;
mybatis中通过关联查询 ;mysql : select a.code, b.txt from tab_a as a lefj join tab_b as b on a.id = b.pid 注意查询的字段;
返回到 resultMap 中
mybatis.xml如下

<resultMap id="joinData" type="a">
        <result property="code" column="code"/>
        <collection property="bList" ofType="com.pojo.b">
            <result property="txt " column="txt "/>
        </collection>
</resultMap>

MySQL中就查询了某些字段映射到 resultMap 中,但是最终返回会将 a 的 id,name 和 b 的 id 的字段也会显示出来并且为 null,
提问 mybatis 如何 将 不需要查询的字段过滤掉?

在MyBatis中,如果你不想查询某些字段并将它们过滤掉,可以使用和标签来定义一个可重用的查询片段,并在需要的地方引用它。

首先,在你的mapper文件中定义一个标签,例如:

<sql id="baseColumns"> a.id, a.code, a.name </sql>

然后,在你的查询语句中使用标签引用这个片段,并在需要的地方添加其他字段,例如:

<select id="yourQuery" resultMap="joinData"> SELECT <include refid="baseColumns"/>, b.txt FROM tab_a as a LEFT JOIN tab_b as b ON a.id = b.pid </select>

这样,你就只查询了需要的字段,并且不会返回不需要的字段。

如果是返回json,可以在你b类上加一个 @JsonInclude(JsonInclude.Include.NON_NULL) 注解,为空的字段就不会返回

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    在MyBatis中,可以使用动态SQL的方式来判断并过滤掉不需要查询的字段。下面是具体的解决方案:

    1. 在MyBatis的XML配置文件中,可以使用<if>标签来判断字段是否需要查询,并使用<include>标签来包含需要查询的字段,如下所示:
    <resultMap id="myResultMap" type="a">
        <if test="code != null">
            <result property="code" column="code"/>
        </if>
        <if test="txt != null">
            <result property="txt" column="txt"/>
        </if>
        <!-- 其他需要查询的字段 -->
    </resultMap>
    

    在这个示例中,如果codetxt为null,标签内的内容将不会包含在最终的查询结果中。

    1. 在使用关联查询时,可以使用<select>标签来定义关联查询的SQL语句,并在调用时传入需要查询的字段,如下所示:
    <select id="getItems" resultMap="myResultMap">
        SELECT
        <include refid="columnList" />
        FROM tab_a AS a
        LEFT JOIN tab_b AS b ON a.id = b.pid
    </select>
    
    <sql id="columnList">
        <if test="needCode">
            a.code,
        </if>
        <if test="needTxt">
            b.txt,
        </if>
        <!-- 其他需要查询的字段 -->
    </sql>
    

    在这个示例中,使用了<sql>标签定义了一个名为columnList的SQL片段,通过传入needCodeneedTxt参数来决定是否包含codetxt字段。然后在<select>标签中使用<include>标签引用了该片段。

    1. 在Java代码中调用这个查询方法时,需要传入需要查询的字段参数,示例如下:
    public List<MyEntity> getItems(boolean needCode, boolean needTxt) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("needCode", needCode);
        paramMap.put("needTxt", needTxt);
        return sqlSession.selectList("getItems", paramMap);
    }
    

    在这个示例中,定义了一个getItems方法来调用查询方法,并传入了needCodeneedTxt参数来决定是否需要查询对应的字段。

    通过以上的步骤,就可以在MyBatis中过滤掉不需要查询的字段,避免它们显示为null在查询结果中。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你选的返回类型是你写的joinData,我表示深刻的怀疑