mybatis collection 一对多关联查询,单边分页的问题总结!
若想直接通过sql实现多级关联查询表结构得有2 个必不可少的字段:id ,parentId,levelId
id:主键id,
parentId:父id
levelId:表示第几级(表本身关联查询的时候需要用到,不然会有重复数据)
利用mybatis collection 实现一对多关联查询
Dto:(一级)
public class ProvinceInfoDTO implements Serializable {
private String id;
private String name;
private String pinyin;
private String firstLetter;
private List<CitysInfoDTO> cities;
}
Dto:(二级)
public class CitysInfoDTO implements Serializable {
private String id;
private String name;
private String pinyin;
private String firstLetter;
private String acronym;
private List<RegionInfoDTO> regions;
}
Dto(三级)
public class RegionInfoDTO implements Serializable {
private String id;
private String name;
private String pinyin;
private String firstLetter;
}
resultMap
<resultMap id="unloadAreaQueryResultMap" type="com.haoyunhu.res.ProvinceInfoDTO"> // 一级
<result column="aid" property="id"/>
<result column="aname" property="name"/>
<result column="apinyin" property="pinyin"/>
<result column="aletter" property="firstLetter"/>
<collection property="cities" ofType="com.haoyunhu.res.CitysInfoDTO"> //二级
<result column="bid" property="id"/>
<result column="bname" property="name"/>
<result column="bpinyin" property="pinyin"/>
<result column="bletter" property="firstLetter"/>
<result column="bacronym" property="acronym"/>
<collection property="regions" ofType="com.haoyunhu.res.RegionInfoDTO"> // 三级
<result column="cid" property="id"/>
<result column="cname" property="name"/>
<result column="cpinyin" property="pinyin"/>
<result column="cletter" property="firstLetter"/>
</collection>
</collection>
</resultMap>
省市区级联查询sql:
SELECT a.PROV_NAME,
b.PROV_NAME,
c.PROV_NAME
FROM T_DATA_AREAS a
LEFT JOIN T_DATA_AREAS b
ON a.id=b.PROV_PARENTID
LEFT JOIN T_DATA_AREAS C
ON b.id =C.PROV_PARENTID
WHERE a.PROV_LEVELTYPE=1
AND b.PROV_LEVELTYPE =2
AND c.PROV_LEVELTYPE =3
ORDER BY a.PROV_NAME;
以上mybatis的操作最终得到的json是:
{
"id":"310000",
"name":"上海",
"pinyin":"Shanghai",
"firstLetter":"",
"cities":[
{
"id":"310100",
"name":"上海市",
"pinyin":"Shanghai",
"firstLetter":"",
"acronym":"",
"regions":[
{
"id":"230506",
"name":"宝山区",
"pinyin":"Baoshan",
"firstLetter":""
}
]
}
]
}
一对多关联查询单边分页:
上述的这种关联查询时没法直接使用pagehelper分页插件的,因为pagehelper分页插件是针对真个sql 截取,所以只能手动分页(简单,分页无非就是截取sql +查询总条数),
所以若一对多关联查询想分页得针对主表(案例中的A表)截取sql(pageindex pagesize) ,再另外写条sql查询主表(案例中的A表)的记录数 ------注意mysql 的偏移量的概念
还需要注意的坑:
1:这种需要做级联查询,表结构又不满足的坑:若表结构不满足,但是又想省事,就得写sql 把原表整成这种固定格式的临时表结构(子查询)
2:电商领域的商品类目的级联查询和这个省市区的查询一样(都需要levelid,用在查询条件处:where a.levelid=0 and b.levelid=1 and c.levelid=2; 当然这种级联查询可以在java代码中可以实现,三条sql,分别查询 level =0 1 2的,然后java代码里面循环!
mybatis collection 一对多关联查询,单边分页的问题总结!的更多相关文章
- MyBatis:一对多关联查询
MyBatis从入门到放弃四:一对多关联查询 前言 上篇学习了一对一关联查询,这篇我们学习一对多关联查询.一对多关联查询关键点则依然是配置resultMap,在resultMap中配置collecti ...
- mybatis 13: 一对多关联查询
业务背景 根据客户id查询客户基本信息,以及客户存在的订单信息 两张数据表 客户表 订单表 实体类 客户实体类:Customer private Integer id; private String ...
- mybatis一对多关联查询+pagehelper->分页错误
mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: ...
- 7.mybatis一对多关联查询
和第5节一对一查询类似,但是不同的是,一对一使用的是association,而一对多使用collection. 实例: 1个班级Class,对应1个老师Teacher,对应多个学生Student 1. ...
- MyBatis从入门到放弃四:一对多关联查询
前言 上篇学习了一对一关联查询,这篇我们学习一对多关联查询.一对多关联查询关键点则依然是配置resultMap,在resultMap中配置collection属性,别忽略了ofType属性. 搭建开发 ...
- MyBatis关联查询,一对多关联查询
实体关系图,一个国家对应多个城市 一对多关联查询可用三种方式实现: 单步查询,利用collection标签为级联属性赋值: 分步查询: 利用association标签进行分步查询: 利用collect ...
- mybatis一对多关联查询——(九)
1.需求: 查询所有订单信息及订单下的订单明细信息. 订单信息与订单明细为一对多关系. 2. sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关 ...
- MyBatis初级实战之六:一对多关联查询
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- MyBatis多对一,一对多,多对多,一对多关联查询
一.Person实体类 1 public class Person { 2 private Integer personId; 3 private String name; 4 private Int ...
随机推荐
- iostat -d -k -x 1 10
iostat命令详解 转载 2011年08月03日 14:13:58 标签:磁盘 /扩展 /user 99809 iostat iostat用于输出CPU和磁盘I/O相关的统计信息. 命令格式: io ...
- Spell checker - poj 1035 (hash)
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22541 Accepted: 8220 Description Yo ...
- implode 把数组 组成一个字符串
$data=array(1,2,3,4,5); implode(",",$data);
- POJ2947 DAZE [Gauss]
题目是要求建立一个方程组: (mat[1][1]*x[1] + mat[1][2]*x[2] + - + mat[1][n]*x[n])%7 =mat[1][n+1] (mat[2][1]*x[1] ...
- Laravel 5.1 Blade模板引擎
为什么要使用blade 它是干什么用的? blade模板引擎使我们写HTML页面的地方,使用它是因为它能给我们提供很多的遍历,减少代码的重复率 提高开发效率.我们写blade的路径是 resource ...
- Android获取网络类型
public static final String NETWORK_CLASS_UNKNOWN = "unknown"; public static final String N ...
- centos7下挂载U盘和移动硬盘
挂载U盘 1.使用fdisk -l命令查看磁盘情况 [root@localhost ~]# fdisk -l 磁盘 /dev/sda:1000.2 GB, 1000204886016 字节,19535 ...
- Android开发:拖拽
google官网的training和API两个地方都提到了拖拽的实现,两种方法不太一样. 方法一 training(https://developer.android.com/training/ges ...
- oracle中如何判断某个日期是星期几
SELECT to_char(to_date('2011-03-13','YYYY-MM-DD'),'d') FROM DUAL 其中 红色部分为传入日期 to_char的其他用法 Select to ...
- AJAX与后台交互传参的两种方式
工作中的简单总结备忘,防遗失. 第一种:直接传入json数据(后台一个一个入参对接) 1- js请求: var data = {}; data = {"infoId":infoId ...