在Spring Boot中,使用MyBatis的Mapper传递包含多个条件的实体类作为参数时,如何正确配置Mapper接口和XML映射文件

问题描述

学习过程中发现了一个问题 

我需要用sql语句的方法完成分页条件查询 从而获得total和records  下面这个是查询类

@Data
public class SongListQuery implements Serializable {
    private static final long serialVersionUID = 1L;
    // 根据歌手名称 模糊查询
    private String singerName;
    // 根据歌曲名称 模糊查询
    private String songName;
    // 根据发布状态状态进行查询
    private Integer status;
}

Mapper方法类的定义是这样的

// 分页动态查询 records
List<SongListVo> getSongListPageQuery(
     @PathVariable("startIndex") int startIndex,
     @PathVariable("pageSize") int pageSize,
     @RequestBody SongListQuery songListQuery);

// only动态!查找 总长度total  (这里不要分页)
int getSongListQueryCount(@RequestBody SongListQuery songListQuery);

但在写mapper.xml的时候出现了问题

<select id="getSongListPageQuery" 
parameterType="com.zhangmingjian.kpopservice.entity.vo.SongListQuery"            
resultType="com.zhangmingjian.kpopservice.entity.vo.SongListVo">
        select
            song.id AS id,
            song.name AS songName,
            song.cover,
            song.release_time AS releaseTime,
            song.status AS status,
            singer.name AS singerName
        from
            kpop_song song
                LEFT JOIN kpop_singer singer on singer.id = song.singer_id
        WHERE
		    1=1
        <if test="songListQuery.songName != null and songListQuery.songName != ''">
            AND song.name LIKE CONCAT('%', #{songListQuery.songName}, '%')
        </if>
        <if test="songListQuery.singerName != null and songListQuery.singerName != ''">
            AND singer.name LIKE CONCAT('%', #{songListQuery.singerName}, '%')
        </if>
        <if test="songListQuery.status != null">
            AND song.status = #{songListQuery.status}
        </if>
        LIMIT #{startIndex},#{pageSize}
    </select>


    <select id="getSongListQueryCount" 
parameterType="com.zhangmingjian.kpopservice.entity.vo.SongListQuery" 
resultType="java.lang.Integer">
        SELECT COUNT(*)
        FROM kpop_song song
        LEFT JOIN kpop_singer singer ON singer.id = song.singer_id
        WHERE
        1=1
        <if test="songListQuery.songName != null and songListQuery.songName != ''">
            AND song.name LIKE CONCAT('%', #{songListQuery.songName}, '%')
        </if>
        <if test="songListQuery.singerName != null and songListQuery.singerName != ''">
            AND singer.name LIKE CONCAT('%', #{songListQuery.singerName}, '%')
        </if>
        <if test="songListQuery.status != null">
            AND song.status = #{songListQuery.status}
        </if>
    </select>

代码较长 可以省略观看 直接说一下问题 但是我再运行这两个方法的时候 第一个方法没有问题 第二个方法爆出了这样的错误

"message": "nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'songListQuery' in 'class com.zhangmingjian.kpopservice.entity.vo.SongListQuery'",

"message": "nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'songListQuery' in 'class com.zhangmingjian.kpopservice.entity.vo.SongListQuery'"

我不理解的是 同样都是传入 songListQuery 只是少了分页条件 为什么第二个会出现问题

解决方法

将第二段代码改成

<select id="getSongListQueryCount" 
parameterType="com.zhangmingjian.kpopservice.entity.vo.SongListQuery" 
resultType="java.lang.Integer">
        SELECT COUNT(*)
        FROM kpop_song song
        LEFT JOIN kpop_singer singer ON singer.id = song.singer_id
        WHERE
        1=1
        <if test="songName != null and songName != ''">
            AND song.name LIKE CONCAT('%', #{songName}, '%')
        </if>
        <if test="singerName != null and singerName != ''">
            AND singer.name LIKE CONCAT('%', #{singerName}, '%')
        </if>
        <if test="status != null">
            AND song.status = #{status}
        </if>
    </select>

这里  直接用类属性(✔)  不要用 实体类.属性(❌)

原因分析

本帖子只用于记录自己学习碰到的问题  自己还是有很多不懂得

我的理解是(可能错误,主要是能让代码run起来)

第一个方法传入了三个参数 包括了 startIndex,pagesize来指导分页查询 以及 singListQuery来控制动态查询

而第二个方法 只有一个参数 就是 singListQuery来控制动态查询 

所以第二个sql语句编写的过程中 可以直接使用 类的属性名称

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值