sql语句-实体属性有集合怎么批量查询

1、背景

前端返回一个实体类,实体类里还有集合。要对集合外的属性查询,还要对集合批量查询,并且属性可能为空。返回给前端的结果是个实体类,实体类里有集合。

2、前端实体类

java 复制代码
public class AppletSyncDiseaseInfoBO {

    // 病害信息同步接口

    /**
     * 组织id
     */
    private Integer organizationId;

    /**
     * 最后一次同步时间,病害更新时间小于此时间的不同步,可为空
     */
    private String lastSyncTime;

    /**
     * 返回结果中的坐标系WGS84等,待约定
     */
    private String coordinate;

    /**
     * 路面类型:沥青A,水泥D
     */
    private char roadSurface;

    /**
     * 病害集合
     */
    private List<AppletDiseaseInfoBO> disease;
}
java 复制代码
public class AppletDiseaseInfoBO {

    /**
     * 病害类型
     */
    private String proType;

    /**
     * 筛选上限,为空则不做筛选
     */
    private Double upperLimit;

    /**
     * 筛选下限,为空则不做筛选
     */
    private Double lowerLimit;

}

3、返回给前端的实体类

java 复制代码
public class AppletDiseaseInfoVO {

    /**
     * 组织id
     */
    private Integer organizationId;

    /**
     * 接口调用结果返回时间
     */
    private String nowTime;

    /**
     * 返回结果中的坐标系WGS84等,待约定
     */
    private String coordinate;

    List<AppletDiseaseVO> problem;
}
java 复制代码
public class AppletDiseaseVO extends AppletDiseaseBO {
    /**
     * 病害id
     */
    private Integer proId;

    /**
     * 识别任务id
     */
    private Integer subId;

    /**
     * 图片id
     */
    private Integer picId;

    /**
     * 病害类型
     */
    private String proType;

    /**
     * 病害名称
     */
    private String proName;

    /**
     * 经度
     */
    private Double lon;

    /**
     * 纬度
     */
    private Double lat;

    /**
     * 道路id
     */
    private Integer roadId;

    /**
     * 道路区间id
     */
    private Integer roadIntervalId;

    /**
     * 道路方向,上行U;下行D
     */
    private char roadDirection;

    /**
     * 桩号
     */
    private Integer chainage;

    /**
     * 桩号偏移量
     */
    private Double chainageOffset;

    /**
     * 影响面积或长度
     */
    private Double proDestroy;

    /**
     * 原始图片地址
     */
    private String picUrl;

    /**
     * 病害发现时间
     */
    private String findTime;
}

4、sql语句

sql 复制代码
    <resultMap id="syncDiseaseInfoMap" type="com.jzsk.presentation.pojo.vo.AppletSyncDiseaseInfoVO">
        <result column="organization_id" property="organizationId"/>
        
        -- 以下就是映射到集合里
        <collection property="problem"  javaType="java.util.List" resultMap="problemsMap"/>
    </resultMap>

    <resultMap id="problemsMap" type="com.jzsk.presentation.pojo.bo.AppletDiseaseBO">
        <result column="proId" property="proId"/>
        <result column="rec_sub_id" property="subId"/>
        <result column="picId" property="picId"/>
        <result column="pro_type" property="proType"/>
        <result column="pro_name" property="proName"/>
        <result column="gps_lon" property="lon"/>
        <result column="gps_lat" property="lat"/>
        <result column="road_id" property="roadId"/>
        <result column="interval_id" property="roadIntervalId"/>
        <result column="road_direction" property="roadDirection"/>
        <result column="chainage" property="chainage"/>
        <result column="chainage_offset" property="chainageOffset"/>
        <result column="pro_destroy" property="proDestroy"/>
        <result column="photo_name" property="photoName"/>
        <result column="output_path" property="outputPath"/>
        <result column="reported_time" property="findTime"/>
        <result column="is_review" property="isReview"/>
    </resultMap>

    <select id="syncDiseaseInfo" parameterType="com.jzsk.presentation.pojo.bo.AppletSyncDiseaseInfoBO"
            resultMap="syncDiseaseInfoMap">
        SELECT
        rrp.organization_id,
        rrp.id as proId,
        rrp.rec_sub_id,
        cp.id AS picId,
        rrp.pro_type,
        rrp.pro_name,
        rrp.gps_lon,
        rrp.gps_lat,
        rl.road_id,
        rs.interval_id,
        rl.road_direction,
        rrp.chainage,
        rrp.chainage_offset,
        rrp.pro_destroy,
        rr.photo_name,
        rs.output_path,
        rs.reported_time,
        rs.lane,
        rr.is_review
        FROM
        rec_result_problem rrp
        
        -- 连表的时候 先去查出子表 加快检索效率 
        LEFT JOIN (SELECT rresult.id,rresult.photo_name,rresult.is_review FROM rec_result rresult WHERE rresult.organization_id = #{organizationId}) AS rr ON rrp.rec_result_id = rr.id
        LEFT JOIN (SELECT rsubmit.id,rsubmit.interval_id,rsubmit.output_path,rsubmit.reported_time,rsubmit.lane,rsubmit.pavement_type,rsubmit.locus_id FROM rec_submit rsubmit WHERE rsubmit.organization_id = #{organizationId}) AS rs ON rrp.rec_sub_id = rs.id
        LEFT JOIN (SELECT rlocus.road_id,rlocus.id,rlocus.road_direction FROM road_locus rlocus WHERE rlocus.organization_id = #{organizationId}) AS rl ON rl.id = rs.locus_id
        LEFT JOIN (SELECT ctask.interval_id,ctask.id FROM capture_task ctask WHERE ctask.organization_id = #{organizationId}) AS ct ON ct.interval_id = rs.interval_id
        LEFT JOIN (SELECT cphoto.task_id,cphoto.id FROM capture_photo cphoto WHERE cphoto.organization_id = #{organizationId}) AS cp ON cp.task_id = ct.id
        WHERE
            rrp.organization_id = #{organizationId}

            <if test="lastSyncTime != null and lastSyncTime != ''">
                AND rrp.create_time &gt;= #{lastSyncTime}
            </if>
            <if test="roadSurface != null and roadSurface != ''">
                AND rs.pavement_type = #{roadSurface}
            </if>

             -- 判断传入的集合是否为空
             -- 如果传入的是数组 就用 <if test="disease != null and disease.length > 0">
            <if test="disease != null and disease.size() > 0">
                AND
                <foreach collection="disease" item="diseaseInfo" open="(" close=")" separator=" OR ">
                   -- separator=" OR " 和 这个括号是精髓
                   -- 比如你传入(A) OR (B) 这里就会取结果的并集
                   -- 如果不加括号 只是 A OR B ,那么满足一个条件就会返回数据
                    (
                    <if test="diseaseInfo.proType != null and diseaseInfo.proType != ''">
                        rrp.pro_type = #{diseaseInfo.proType}
                    </if>
                    <if test="diseaseInfo.upperLimit != null">
                        AND rrp.pro_destroy &lt;= #{diseaseInfo.upperLimit}
                    </if>
                    <if test="diseaseInfo.lowerLimit != null">
                        AND rrp.pro_destroy &gt;= #{diseaseInfo.lowerLimit}
                    </if>
                    )
                </foreach>
            </if>
    </select>

5、其他

如果你只是传入一个集合进行查询

mapper接口要加 @parm("")注解

5.1、maapper层接口
java 复制代码
ResultSectionBO querySectionChainageBySubId(@Param("idList") List<Integer> idList);
5.2、sql语句
sql 复制代码
    <select id="querySectionChainageBySubId"  resultType="com.jzsk.presentation.pojo.bo.ResultSectionBO">
        SELECT MIN(chainage*1000+chainage_offset) AS minChainage,MAX(chainage*1000+chainage_offset) AS maxChainage
        FROM REC_RESULT WHERE is_del='N'
        <if test="idList != null and idList.size >0">
            AND rec_sub_id IN
            <foreach collection="idList" index="index" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
    </select>
相关推荐
Hello.Reader23 分钟前
StarRocks实时分析数据库的基础与应用
大数据·数据库
执键行天涯24 分钟前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
yanglamei196235 分钟前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask
Darling_0037 分钟前
LeetCode_sql_day28(1767.寻找没有被执行的任务对)
sql·算法·leetcode
zxrhhm41 分钟前
SQLServer TOP(Transact-SQL)
sql·sqlserver
工作中的程序员1 小时前
ES 索引或索引模板
大数据·数据库·elasticsearch
严格格1 小时前
三范式,面试重点
数据库·面试·职场和发展
微刻时光1 小时前
Redis集群知识及实战
数据库·redis·笔记·学习·程序人生·缓存
单字叶1 小时前
MySQL数据库
数据库·mysql
mqiqe1 小时前
PostgreSQL 基础操作
数据库·postgresql·oracle