问题描述
学习过程中发现了一个问题
我需要用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语句编写的过程中 可以直接使用 类的属性名称