mybatis @Select注解中如何拼写动态sql
Posted 那些年的代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis @Select注解中如何拼写动态sql相关的知识,希望对你有一定的参考价值。
@Mapper public interface DemandCommentMapper extends BaseMapper<DemandComment>{ @Select("SELECT " + "a.id as ‘id‘,a.create_date as ‘createDate‘,a.content as ‘content‘," + "a.parent_id as ‘parentId‘,a.first_comment_id as ‘firstCommentId‘," + "b.id as ‘fromUser.id‘,b.realname as ‘fromUser.realname‘,b.avatar as ‘fromUser.avatar‘," + "c.id as ‘toUser.id‘,c.realname as ‘toUser.realname‘,c.avatar as ‘toUser.avatar‘ " + "FROM t_demand_comment a " + "LEFT JOIN t_user b ON b.id = a.from_uid " + "LEFT JOIN t_user c ON c.id = a.to_uid " + "WHERE a.demand_id = #{demandId} " + "ORDER BY a.create_date ASC" + "LIMIT #{startNo},#{pageSize}") public List<DemandComment> listDemandComment(@Param("demandId") Long demandId,
@Param("startNo") Integer pageNo,
@Param("pageSize") Integer pageSize);
这样整个语句是写死的,如果我想根据pageNo与pageSize是否为空来判断是否需要分页,该怎么做呢?
如果使用xml来配置的话可以用
<when test=‘startNo!=null and pageSize != null ‘> LIMIT #{startNo},#{pageSize} </when>
如果是用@Select 这种该如何做呢?
方法:用script标签包围,然后像xml语法一样书写
@Mapper public interface DemandCommentMapper extends BaseMapper<DemandComment>{ @Select("<script>" + "SELECT " + "a.id as ‘id‘,a.create_date as ‘createDate‘,a.content as ‘content‘," + "a.parent_id as ‘parentId‘,a.first_comment_id as ‘firstCommentId‘," + "b.id as ‘fromUser.id‘,b.realname as ‘fromUser.realname‘,b.avatar as ‘fromUser.avatar‘," + "c.id as ‘toUser.id‘,c.realname as ‘toUser.realname‘,c.avatar as ‘toUser.avatar‘ " + "FROM t_demand_comment a " + "LEFT JOIN t_user b ON b.id = a.from_uid " + "LEFT JOIN t_user c ON c.id = a.to_uid " + "WHERE a.demand_id = #{demandId} " + "ORDER BY a.create_date ASC " + "<if test=‘startNo!=null and pageSize != null ‘>" + "LIMIT #{startNo},#{pageSize}" + "</if>" + "</script>") public List<DemandComment> listDemandComment(@Param("demandId") Long demandId,
@Param("startNo") Integer pageNo,
@Param("pageSize") Integer pageSize);
项目实例
@Select("<script>" +"select * from mi_taobao where 1=1" +"<if test=‘status != null‘>" +"and status = #{status}" +"</if>" +"</script>") public List<Taobao> getTaobao(@Param("status") Integer status);
在这里还碰到一个问题就是报错:Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘status‘ in ‘class java.lang.Interger‘
出现原因:这里出现的问题是在DAO方法中定义的参数 与 实体中定义的属性不一致 导致的。
解决方案:dao层加@Param("userId")注解即可(实例中就是加上@Param("status"))
public List<DictItem> selectKeyByUserId(@Param("userId") long userId);
以上是关于mybatis @Select注解中如何拼写动态sql的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis之通用mapper使用注解的方式写动态sql-小结
MyBatis在注解上使用动态SQL(@select使用if)