mybatis 值得记录的查询

1: 一对多分页查询

当一对多用<connection>标签时,如果是详情查询可以直接使用,但如果是列表分页时则会出现每页条数错误的问题,原因在于:一对多时,分页数量统计的是这里的多的总数,比如每页10条数据,列表只有5条,原因是这5条每条对应2条子集数据,所以需要用嵌套子查询,记录代码如下:

<resultMap id="listModel" type="com.elementwin.common.model.vo.SpeechcraftContentDetailVO">
        <id column="id" property="id" />
        <result column="structId" property="structId"/>
        <result column="custCategory" property="custCategory"/>
        <result column="rfmLife" property="rfmLife"/>
        <result column="star" property="star"/>
        <result column="title" property="title"/>
        <result column="top" property="top"/>
        <result column="updateTime" property="updateTime"/>
        <result column="displayArea" property="displayArea"/>
        <result column="businessType" property="businessType"/>
        <result column="useType" property="useType"/>
        <result column="orgName" property="orgName"/>
        <result column="updateByName" property="updateByName"/>
        <!-- 这里即为嵌套子查询,id和carModelId都是取的主查询结果字段,作为参数传给子查询使用-->
        <collection property="carModelList" ofType="com.elementwin.common.model.SpeechcraftContentCarRel" select="queryListModel" column="{id=id, carModelId=carModelId}">
        </collection>

    </resultMap>
    <!-- 列表查询 -->
    <select id="pageList" resultMap="listModel">
        select
            sc.id, sc.struct_id as structId, sc.cust_category as custCategory, sc.rfm_life as rfmLife, sc.star, sc.title, sc.top,
            date_format(sc.update_time,'%Y-%m-%d %H:%i:%S') as updateTime,
            ss.display_area as displayArea,
            pe.business_type as businessType, pe.use_type as useType,
            o.short_name as orgName,
            upu.realname AS updateByName,
            <!-- 这里取的是接口入参传进来的参数,非查询结果需要,是虚拟参数,用来传给子查询作为参数使用-->
            IFNULL(#{query.carModelId}, '') AS carModelId    
        from
            speechcraft_struct_content sc
        left join
            speechcraft_struct ss on sc.struct_id = ss.id
        left join
            speechcraft pe on ss.speech_id = pe.id
        left join
            organization o on pe.org_id = o.id
        left join
            user upu on upu.id = sc.update_by
        where
            sc.active = 1
        and
            ss.active = 1
        and
            pe.active = 1
        <if test="query.structId == null or query.structId == ''">
            and
            struct_id in
            <foreach collection="structIds" item="structId" open="(" separator="," close=")">
                #{structId}
            </foreach>
        </if>
        <if test="query.title != null and query.title != ''">
            and sc.title like concat('%', #{query.title}, '%')
        </if>
        <!-- 因为主表数据是需要符合查询条件的分页数量,所以这里主表是需要先根据条件进行筛选,主表的id筛选结果必须是 符合子表中的查询结果 -->
        <if test="query.carModelId != null and query.carModelId != ''">
            and sc.id in (select content_id from speechcraft_content_car_rel where car_model_id = #{query.carModelId})
        </if>
        order by
        sc.update_time desc,
        sc.create_time desc
        <if test="page != null">
            limit #{page.begin}, #{page.pageSize}
        </if>

    </select>
    <!-- 子查询 -->
    <select id="queryListModel" resultType="com.elementwin.common.model.SpeechcraftContentCarRel">
        select
            car.content_id AS contentId, car.car_model_id AS carModelId, d.name AS carName
        from
            speechcraft_content_car_rel car
        left join
            car_data d on car.car_model_id = d.id
        where
            car.content_id = #{id}
        <!-- 下面这个where条件是不需要的,放在这里的原因是为了呈现,carModelId也是传进来的参数可以使用 -->
        <!--==<where>
            car.content_id = #{id}
            <if test="carModelId != null and carModelId != ''">
                and car.content_id in (select content_id from speechcraft_content_car_rel where car_model_id = #{carModelId})
            </if>
        </where>-->
    </select>

功能需要实现:
列表数据分页,主表数据关联子表,结果呈现是以主表分页,其中一对多包含多个子表数据,并且子表中的字段值也作为判断依据。
代码位于yuanbing公司management项目:com.elementwin.common.service.mapper.SpeechcraftStructContentMapper#pageList

2: 用判断等构造出一个查询字段用于sql使用

<select id="contentPageList" parameterType="com.elementwin.common.model.dto.PageParam" resultType="com.elementwin.common.model.speechcraft.dto.SpeechcraftContentDTO">
        SELECT content.struct_id structId,struct.parent_id as structParentId, content.id, content.title, content.star,
            case when
                (content.top = 1 and #{model.currentTime} BETWEEN content.top_begin_time AND content.top_end_time) then 1
            else 0
            end AS top
        FROM speechcraft_struct_content content
        LEFT JOIN speechcraft_struct struct ON struct.id = content.struct_id
        LEFT JOIN speechcraft self ON self.id = struct.speech_id
        <where>
            <include refid="contentSearchQueryVO"></include>
        </where>
        ORDER BY top desc, content.top_begin_time desc, content.update_time desc, struct.parent_id ASC, struct.sort ASC, content.create_time DESC
        <choose>
            <when test="begin != null">
                LIMIT #{begin}, #{pageSize}
            </when>
        </choose>
    </select>

列表查询出的每一列数据,当查询出的这列结果中content.top=1并且传进来的时间在top_begin_time和top_end_time之间,则为1,否则为0,并取别名为top。
作用有2个:
一个是业务需要,需求是本来top为1就是置顶,但是搜索的时候是否置顶还有一个条件,当前时间并且必须在置顶开始时间和结束之间才显示为置顶。所以,这里查询用了case when
二个是通过构造的这个查询列可以作为下面sql其他判断等语句使用,比如这里就作为排序使用
备注:可以有多个case when。
代码位于yuanbing公司business项目:com.elementwin.common.service.mapper.SpeechcraftMapper#contentPageList

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容