有些时候,我们需要拼接一些sql查询结果,作为vo的返回。比如下面这个vo,除了返回一些基础字段以外,还会返回一些子列表来表示多条信息。当然子列表还会继续套子列表。
举例如下:
public class CooperationLandVo implements Serializable {
/**
* updateFlag(新增:flase ;更新 true)
*/
@JSONField(ordinal=1)
protected Boolean updateFlag;
/**
* 合作机构id
*/
@JSONField(ordinal=2)
protected String cooperationId;
/**
* 合作机构名称
*/
@JSONField(ordinal=3)
protected String cooperationName;
/**
* 合作机构code
*/
@JSONField(ordinal=4)
protected String cooperationCode;
/**
* 合作状态(0:未合作,1:合作中,2:停止合作)
*/
@JSONField(ordinal=5)
protected String cooperateStatus;
/**
* 合作开始时间
*/
@JSONField(ordinal=6,format="yyyy-MM-dd HH:mm:ss")
protected Date cooperateStartTime;
/**
* 合作结束时间
*/
@JSONField(ordinal=7,format="yyyy-MM-dd HH:mm:ss")
protected Date cooperateEndTime;
/**
* 优先级权重
*/
@JSONField(ordinal=8)
protected Integer weight;
/**
* 机构类型:资方/险方
*/
@JSONField(ordinal = 9)
protected CooperationLandBaseDto.Type bigType;
/**
* 机构小类
*/
@JSONField(ordinal = 10)
protected Integer type;
@JSONField(ordinal=12)
List cooperationLandCompanyVoList;
@JSONField(ordinal=11)
List cooperationLandProductVoList;
其中,CooperationLandCompanyVo下又带有子列表CooperationLandSubcapVo
public class CooperationLandCompanyVo implements Serializable {
/**
* 合作机构id
*/
@JSONField(serialize=false)
protected String cooperationId;
/**
* 分公司编码
*/
protected String companyCode;
/**
* 落地城市名称
*/
protected String cityName;
/**
* 落地城市id
*/
protected String cityId;
/**
* 启用人
*/
protected String createUserName;
/**
* 启用人id
*/
protected String createUserId;
/**
* 启用时间
*/
@JSONField(format="yyyy-MM-dd HH:mm:ss")
protected Date groundTime;
/**
* 下级机构
*/
List cooperationLandSubcapVoList;
}
对于这样的结构,我想通过mybatis的查询直接获取到这个结构,我就需要拼装和嵌套resultMap。
如下:
这里我想问有没有不需要写resultMap就能返回嵌套结果的情况。比如直接使用某种方式,返回类型为resultType之类的,如果大神看到,求评论,求私信
然后对于其中的cooperationLandCompanyVoList这个子集合,返回也是用一个resultMap,嵌套下级机构的返回集合。如下:
接着是三个嵌套部分的子查询:
我们设置了关联的column为cooperationId(看resultMap的collection列),但是对于实际的返回,我们不需要这一列的信息,因为在主查询中,已经获取了。
所以我们可以去掉在sql中对于这一列的“as”操作,也就是不将他映射至vo中。但是鉴于CooperationLandCompanyVo本身需要再次和下级嵌套,所以它的cooperationId是不可以省略的(如果没有这里的第二层嵌套关系,就可以全部省略)
这样,在最终获取结果集的时候,对于没有的子查询,不会返回[{}](如果设置了不序列化cooperationId),而是[]。
前端展示时就不会多一条空记录了。
同样的,这里的
如果是没有双层嵌套,这样已经满足了,返回类型直接是CooperationLandVo即可。但是如果存在这样的嵌套。需要在外层继续操作一下,手动去掉它。
public CooperationLandVo getCapitalLandInfoDetail(String cooperationId) {
//这里其实已经查询完毕了,下面的操作都是为了去掉空对象。
CooperationLandVo cooperationLandVo = cooperateCapitalLandManager.getLandInfoDetail(cooperationId);
if(CollectionUtils.isEmpty(cooperationLandVo.getCooperationLandCompanyVoList())||cooperationLandVo.getCooperationLandCompanyVoList().get(0)==null){
cooperationLandVo.setCooperationLandCompanyVoList(new ArrayList());
}else{
List cooperationLandCompanyVos = cooperationLandVo.getCooperationLandCompanyVoList();
for(CooperationLandCompanyVo cooperationLandCompanyVo:cooperationLandCompanyVos){
if(CollectionUtils.isEmpty(cooperationLandCompanyVo.getCooperationLandSubcapVoList())||cooperationLandCompanyVo.getCooperationLandSubcapVoList().get(0)==null){
cooperationLandCompanyVo.setCooperationLandSubcapVoList(new ArrayList());
}
}
}
if(CollectionUtils.isEmpty(cooperationLandVo.getCooperationLandProductVoList())||cooperationLandVo.getCooperationLandProductVoList().get(0)==null){
cooperationLandVo.setCooperationLandProductVoList(new ArrayList());
}
return cooperationLandVo;
}
返回结果:
{
"code": "0000",
"isSuccess": true,
"msg": "成功",
"result": {
"updateFlag": true,
"cooperationId": "0000000000",
"cooperationName": "招商银行",
"cooperationCode": "ZSYX",
"cooperateStatus": "1",
"cooperateStartTime": "2017-09-12 00:00:00",
"cooperateEndTime": "2020-09-12 00:00:00",
"weight": 0,
"bigType": "CAP",
"type": 0,
"cooperationLandProductVoList": [
{
"loanNode": "XXX",
"loanNodeName": "XXXXXX",
"productId": "XXXXX",
"productName": "XXXXX"
}
],
"cooperationLandCompanyVoList": [
{
"cityName": "上海市",
"companyCode": "021000",
"cooperationLandSubcapVoList": [
{
"bankCode": "XXXX",
"subCapitalCode": "122222",
"subCapitalId": "22222222",
"subCapitalName": "xx银行"
},
{
"bankCode": "XXXXXXX",
"bankName": "交通银行",
"subCapitalId": "3333333"
}
],
"createUserId": "1",
"createUserName": "系统管理员",
"groundTime": "2019-10-24 15:09:38"
},
{
"cityName": "淮安市",
"companyCode": "517170",
"cooperationLandSubcapVoList": [],
"createUserId": "1111",
"createUserName": "XXX",
"groundTime": "2017-11-16 18:29:13"
},
{
"cityName": "东莞市",
"companyCode": "769000",
"cooperationLandSubcapVoList": [],
"createUserId": "1222",
"createUserName": "XXXX",
"groundTime": "2017-11-16 18:23:13"
}
]
},
"success": true
}