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代码里面循环!

原文地址:https://www.cnblogs.com/YJZUUID/p/9295975.html

时间: 2024-08-08 09:57:24

mybatis collection 一对多关联查询,单边分页的问题总结!的相关文章

mybatis一对多关联查询——(九)

1.需求: 查询所有订单信息及订单下的订单明细信息. 订单信息与订单明细为一对多关系. 2.      sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.o

MyBatis关联查询,一对多关联查询

实体关系图,一个国家对应多个城市 一对多关联查询可用三种方式实现: 单步查询,利用collection标签为级联属性赋值: 分步查询: 利用association标签进行分步查询: 利用collection标签进行分步查询 单步查询 利用collection标签实现一对多单步关联查询: 指定进行关联查询的Java Bean字段,即collection标签的 property 属性: 指定集合中的Java Bean类型,即collection标签的 ofType属性: 实体类 public cla

mybatis一对多关联查询+pagehelper-&gt;分页错误(toSolve)

mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: todo 疑惑: 之前有人提过类似的issue(https://github.com/pagehelper/Mybatis-PageHelper/issues/149)为什么被关闭了 原文地址:https://www.cnblogs.com/goingforward/p/8492448.html

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但

MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)

MyBitis(iBitis)系列随笔之一:MyBitis入门实例 MyBitis(iBitis)系列随笔之二:类型别名(typeAliases)与表-对象映射(ORM) MyBitis(iBitis)系列随笔之三:简单实现CRUD MyBitis(iBitis)系列随笔之四:多表(多对一查询操作) MyBitis(iBitis)系列随笔之五:多表(一对多关联查询) MyBitis(iBitis)系列随笔之六:mybitis与spring集成 这篇博文介绍的是多表中的一对多表关联查询还是按照上一

[转]NHibernate之旅(10):探索父子(一对多)关联查询

本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NHibernate查询语言(HQL,NHibernate Query Language).条件查询(Criteria API,Query By Example(QBE)是Criteria API的一种特殊情况).原生SQL(Literal SQL,T-SQL.PL/SQL).这一节分别使用这三种方式来

mybatis映射文件select_resultMap_关联查询_collection定义关联集合

知识点:查询一个实体类,并查出这个类下面的集合 Employee.java实体类 package com.hand.mybatis.bean;public class Employee {    private Integer eId;    private String eName;    private Integer gender;    private String email;    private Department dept;        public Employee() {

Mybatis_一对多关联查询

person表对应orders表,一个人能下好几个订单.查询一个人下的所有订单. 有Orders类和Person类. 在Person类中加上一句: private List<Orders> orderList;  并生成setter getter. <!--=======多表关联查询=======--> <!-- collection:集合的意思,property要和类中list名一样 ,ofType是集合中泛型也就是属性类型是什么--> <resultMap t

Mybatis学习——一对多关联表查询

1.实体类 1 public class Student { 2 private int id; 3 private String name; 4 } 5 public class Classes { 6 private int id; 7 private String name; 8 private Teacher teacher; 9 private List<Student> students; 10 } 2.映射文件 1 <?xml version="1.0"