MyBatis返回整个对象,只想要返回其中的几个字段

我在Mybatis中通过id查询,只想返回这个对象中的几个字段,下面这样写,也会返回一个整个对象呢?


 <select id="commentOfSongId" resultMap="songResultMap" parameterType="java.lang.Integer">
        select
        id,user_id,song_id,content,create_time
        from comment
        where song_id = #{songId}
    </select>

img

如果使用了lombak 库 可以使用@ToString.Exclude 排除指定的字段,或者使用 @JsonInclude(JsonInclude.Include.NON_NULL) 放到属性上,或者放到类上
这样将不再参与序列化

这返回的是一个map,就是你查询的这几个字段

你可以这样写,将字段有下划线的重新as命名一下即可,然后只返回对应需要的字段,如下,我不需要返回create_time字段


 <select id="commentOfSongId"  parameterType="java.lang.Integer">
        select
        id,user_id as userId,song_id as songId,content
        from comment
        where song_id = #{songId}
    </select>

或者在<resultMap id="songResultMap"中,将不需要的字段删除,然后将其他的字段重新建立一个实体类出来,<resultMap id="songResultMap" type="新的实体类"

1、你想返回几个字段,那么这些字段一定可以组成一个实体类对象,所以你需要重新新建一个实体类。接收返回值。
2、其实没必要新建实体类,如果你想只返回几个字段,那么用原实体类接收也可以,也就是返回值为 songResultMap ,你就可以直接获取这几个字段值就可以了,比如 getId(),getUserId()等等。


<select id="commentOfSongId" resultType="你的实体类" parameterType="java.lang.Integer">
        select
        id,user_id,song_id,content,create_time
        from comment
        where song_id = #{songId}
</select>

这样就可以了

那反问你一下,你写一个类,然后创建类的实例对象,只给某一个属性赋值,其他属性值是对应类型的默认值,还是压根就没有这个字段?

1.你只想要指定字段的 user_id,和 song_id 和 content
则只要查询的时候指定即可如下

 
<select id="commentOfSongId" resultMap="newSongResultMap" parameterType="java.lang.Integer">
        select
        user_id,song_id,content
        from comment
        where song_id = #{songId}
    </select>

  1. 或者写一个 增强器只查询指定列
    可以参考这个博客
    https://blog.csdn.net/zy1404/article/details/116784242?spm=1001.2014.3001.5502

题主的要求有点古怪啊,正常来讲,如果用一个实体去数据库映射肯定会把所有映射到的值全部映射到对应的字段上,然后返回,如果该字段没有值,就返回null或0或其他默认值。您这个有三种方案,1、更换框架,但仍然需要重构实体;2、在MyBatis框架基础上重构一个实体,相对前者成本较低,但该类的作用范围太小,完全不必要;3、反射实现,只需要写一个方法,反射你想要的字段值,但面临一个问题,如果你要在前端使用,只有值没有 key是无法取值的,所以综合情况来看,您还是需要重构实体的。

resultMap="map"

这个是controller返回时,json序列的选定。假如只想要在前端返回特定的字段,需要在实体类的不要返回的字段上加上@JsonIgnore。如果是想为null的不返回只需要在类上加@JsonInclude(JsonInclude.Include.NON_NULL)注解。json我用的是jackson

如果是考虑安全问题的话,可以用map把指定的值返回到前端去比如map.put("user_id","user_id");这样一来就算访问接口拿到的值也只有那几个