mybatis中collection嵌套使用

本文详细介绍了在mybatis中如何使用resultMap的collection标签进行嵌套,以实现查询信用主体的近两年项目及其所有包。文章讨论了实现思路,包括筛选条件和性能考虑,并提供了vo实现及Dao层的实现细节,特别强调了resultMap中嵌套collection的配置方法。
摘要由CSDN通过智能技术生成

mybatis中collection嵌套使用

@author 无忧少年

@createTime 2019/10/25

1. 问题

刚完成的项目,突然又改了需求,在为了不大改动原先代码的原则下,得使用mybatis的resultMap中的collection再嵌套一层collection实现,这个也是这次需求的难点,此次就记录一下collection 嵌套collection 的实现逻辑。

2. 实现思路

  1. 首先要再sql查询出一个信用主体的近两年的所有以项目为维度的所有项目,用两层的集合实现,第一层集合为所有以项目为维度的近两年项目的集合,第二层集合为当前项目的所有包。
  2. 在第一步中取出的集合在进行好中差评数量的计算,首先要筛掉未评价完的项目和最新评价完的包不是今年的项目进行统计,以项目中最差的评价结果为此项目的评价结果。

此次实现的难点主要在如何使用sql将这个两层的集合查询出来,使用了collection标签嵌套collection标签实现这个难点。还有一个就是效率问题,因为查询专家停用会查询出所有的专家,在进行专家评价次数的计算,整个评价结果次数的计算都在java代码中,效率可能会比较低,目前未发现较好的优化方法。

3.代码实现

3.1 vo实现

CommentTypeAndNumVo.java

/**
 * 好评中评差评VO
 */
public class CommentTypeAndNumVo extends BaseVo {
   

  //好评数
  private Integer positiveComment;
  //中评数
  private Integer moderateComment;
  //差评数
  private Integer negativeComment;
}

CreditAllCommentNumVo.java

/**
 * @description: 信用主体所有种类评价的数量
 * @author: lisiwen
 * @create: 2019-10-23 16:26
 **/
public class CreditAllCommentNumVo extends CommentTypeAndNumVo {
   
    private String creditCode;
    private String creditType;
}

CreditAllProjVo.java

/**
 * @description: 信用主体完成评价项目vo
 * @author: lisiwen
 * @create: 2019-10-22 14:07
 **/
public class CreditAllProjVo extends BaseVo {
   
    /**
     * 信用主体编码
     */
    private String creditCode;
    /**
     * 信用主体编码
     */
    private String creditId;
    /**
     * 信用主体类型
     */
    private String creditType;
    /**
     * 年度
     */
    private String setYear;
    /**
     * 数据来源
     */
    private String dataSource;
    /**
     * 信用主体项目集合
     */
    private List<CreditProjVo> creditProjVoList;
}

CreditProjVo.java

/**
 * @description: 信用主体项目Vo(同一次评审为一个项目)
 * @author: lisiwen
 * @create: 2019-10-22 14:12
 **/
public class CreditProjVo extends BaseVo {
   
    /**
     * 项目id
     */
    private String projId;
    /**
     * 开标时间
     */
    private Date bidOpenDate;
    /**
     * 数据来源
     */
    private String dataSource;
    /**
     * 信用主体id
     */
    private String creditId;
    /**
     * 信用主体类型
     */
    private String creditType;
    /**
     * 年度
     */
    private String setYear;

    /**
     * 项目的包信息
     */
    private List<CreditProjPackageVo> creditProjPackageVoList;
}

CreditProjPackageVo.java

/**
 * @description: 信用主体项目包vo
 * @author: lisiwen
 * @create: 2019-10-22 14:19
 **/
public class CreditProjPackageVo extends BaseVo {
   
    /**
     * 项目id
     */
    private String projID;
    /**
     * 项目年度
     */
    private String setYear;
    /**
     * 信用主体该包评价得分好中差评
     */
    private String commentLevel;

    /**
     * 项目评价单评价完成时间
     */
    private Date evaDate;
}

3.2 Dao层实现

ICreditInfoRestfulDao.java

public interface ICreditInfoRestfulDao {
   
    /**
     * @param creditEntityStatusVoList 信用主体的集合(主要使用code) 未传入则查询所有
     * @param creditType 信用主体类型  如果为传入默认查询专家
     * @param dataSource 数据来源
     * @param setYear    年度
     * @Description: 查询指定信用主体类型和信用主体编码和指定年度和指定数据来源的所有项目的集合
     * @Author: lisiwen
     * @CreateDate: 2019/10/22 16:17
     */
    List<CreditAllProjVo> selectCreditAllProjList(@Param("creditEntityStatusVoList") List<CreditEntityStatusVo> creditEntityStatusVoList,@Param("creditType")String creditType,@Param("setYear") String setYear, @Param("dataSource") String dataSource); 
    
}

CreditInfoRestfulMapper.xml

    <resultMap id="CreditProjPackageVoMap"
               type="com.company.project.bc.domain.vo.creditscorecalc.creditproj.CreditProjPackageVo">
        <result column="PROJ_ID" property="projID" jdbcType="VARCHAR"/>
        <result column="SET_YEAR" property="setYear" jdbcType="VARCHAR"/>
        <result column="COMMENT_LEVEL" property="commentLevel" jdbcType="VARCHAR"/>
        <result column="create_date" property="evaDate" jdbcType="VARCHAR"/>
    </resultMap>

    <resultMap id="CreditProjVoMap" type="com.company.project.bc.domain.vo.creditscorecalc.creditproj.CreditProjVo">
        <result column="GET_PROJ_ID" property=
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值