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>
相关推荐
SelectDB42 分钟前
开源替代怎么选:能力对照、三条部署路径与四类边界速查
数据库·云原生·开源
SelectDB43 分钟前
自建与托管怎么选:开源自建、私有化与云上托管三条路径速查
数据库·云原生·开源
这个DBA有点耶43 分钟前
深入 OLTP 锁与并发:从行锁到分布式事务的一致性权衡
数据库·架构·产品
SelectDB44 分钟前
数仓 TCO 怎么算:五项成本拆解框架速查
大数据·数据库·开源
虚拟世界AI1 小时前
Kronos 时间序列数据库新手部署与实战指南
数据库
愤怒火龙果1 小时前
AI攻防 AIRT03-RAG Exploitation & Vector Database Attacks
数据库·人工智能·网络安全
SelectDB2 小时前
高并发 BI 看板怎么撑住:隔离与加速配置速查
大数据·数据库·数据分析
l1t2 小时前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
麦壳饼3 小时前
SonnetDB:向量召回率评估中的精确基线与参数记录
数据库·sonnetdb
ClouGence3 小时前
数据如何随时可用?广西水牛先生的 MySQL 实时同步实践
数据库·mysql·数据分析