当前的问题:同一张表中存放省市区县的数据,如何通过一条SQL语句将省市区县都查询出来,
且省级包含所有的市级列表,市级中又包含县级的数据。
想法:利用mybatis集合的嵌套查询(collection)
数据格式如下:
Java实体类如下:
public class Area implements Serializable{
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
private Integer id;
/**
* 地区名称
*/
private String name;
/**
* 地区编码
*/
private Integer areaId;
/**
* 上一级地区编码
*/
private Integer parentId;
/**
* 下一级地区列表
*/
private List subAreas;
...getter 和 setter 方法...
}
xml:
支持两层嵌套的例子
select
a.id, a.name, a.area_id,
b.id bid, b.name bname, b.area_id barea_id
from area a
left join area b on b.parent_id = a.area_id
where a.parent_id is null
测试方法:
public class MybatisTest {
@Test
public void test(){
ApplicationContext application =
new ClassPathXmlApplicationContext("classpath*:spring/applicationContext.xml");
AreaMapper areaMapper = application.getBean(AreaMapper.class);
List areaList = areaMapper.queryAllCity();
System.out.println(areaList.size());
System.out.println(areaList.get(0).getSubAreas().size());
System.out.println(JsonUtils.objectToJson(areaList));
}
}
运行结果:
结论:
从上面的的测试数据可以看出已经支持两层嵌套,但是如果还要往id为“areasOther”的的中再嵌套一层,目的是支持三层嵌套,暂时不知道如何操作???
尝试失败的案例:
select
a.id, a.name, a.area_id,
b.id bid, b.name bname, b.area_id barea_id,
c.id cid, c.name cname, c.area_id carea_id
from area a
left join area b on b.parent_id = a.area_id
left join area c on c.parent_id = b.area_id
where a.parent_id is null
以上案例并没有成功,不知道是不是queryAllCity的sql语句书写问题,请大牛指点!
另一种支持多层嵌套的方式:
select="queryCityByParentId">
select
a.id, a.name, a.area_id, a.parent_id
from area a where a.parent_id = #{area_id}
select
a.id, a.name, a.area_id, a.parent_id
from area a where a.parent_id is null
以上方式在collection中将select指定的查询语句循环调用,查询条件为column的数据,最终将查询的结果放到property指定的属性中
执行结果: