• 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);

  • 相关阅读:
    java图片裁剪原理
    代码整洁之道
    vue.js devtools安装
    Convert DateTime To Varchar with multiple Styles
    Sql Server为数值变量添加删除前导后缀(翻译)
    asp.net ckeditor 3.6.2 + ckfinder 2.1 上传图片
    转摘 IE6 动态创建 iframe 无法显示的 bug
    sql server output parameter
    windows7 无法删除文件夹 提示需要SYSTEM权限
    Kooboo 全文索引研究
  • 原文地址:https://www.cnblogs.com/goloving/p/9241421.html
Copyright © 2020-2023  润新知