现有数据库如下:
需求:给定用户uid即可查询该用户所拥有的所有school和每一个school下所有的building
现有School类如下:
现有Building类如下:
直接根据数据库的字段构建相应的类并不能满足查询的需求,我们希望School类中直接有一个List类型的字段用来存放building对象,这样查询就只需迭代遍历就可以了。
为此我们新建一个类
注意:forJson包下的类是用来兼容协议的,所以里面的字段需要根据协议来定
我们这次测试直接在单元测试里演示
我们先用List去存放该用户的所有School对象
int uid = 14; //用户的id
SchoolDao schoolDao = new SchoolDao(); //学校的Dao类
List<School> list_s = schoolDao.query(uid);//声明一个数组存放school对象,用于存放Dao类的查询结果
System.out.println(list_s);
接下来去遍历List,代码如下:
for (School school : list_s) {
project project = new project();
project.setProject_id(school.getSid());
project.setProject_name(school.getName());
System.out.println(project);
}
我们接下来只要再以每一个学校的id(即project_id)为索引信息去遍历每一间学校下面的所有Building丙炔存放到area_info字段就可以了
代码如下:
BuildingDao buildingDao = new BuildingDao();
List<Building> list_b = buildingDao.query(uid, school.getSid());
List b_list = new ArrayList();
for (Building building : list_b) {
b_list.add(building);
}
project.setArea_info(b_list);
System.out.println(project);
可以看到现在project对象已经填充完毕了
但是问题来了,我们用什么去存放project对象呢?我们在一开始再声明一个List容器,用来存放project对象
最后以JSON输出即可
可能会出现的问题
- JSON字符串顺序不对
这是fastjson库内部决定的,我们只需要传参给构造函数即可解决,具体原因自行百度
- null值不显示
这也是fastjson库内部决定的,我们只需要做一步转换即可
object.put("project", s_list);
String str = JSONObject.toJSONString(object, SerializerFeature.WriteMapNullValue);
System.out.println(str);
完整代码
@Test
public void testQuery() {
int uid = 14; //用户的id
JSONObject object = new JSONObject(true); //新建一个fastjson的实体类
SchoolDao schoolDao = new SchoolDao();
List s_list = new ArrayList();//声明一个数组存放project对象
List<School> list_s = schoolDao.query(uid);//声明一个数组存放school对象
for (School school : list_s) {
project project = new project();
project.setProject_id(school.getSid());
project.setProject_name(school.getName());
BuildingDao buildingDao = new BuildingDao();
List<Building> list_b = buildingDao.query(uid, school.getSid());
List b_list = new ArrayList();
for (Building building : list_b) {
b_list.add(building);
}
project.setArea_info(b_list);
s_list.add(project);
}
object.put("project", s_list);
String str = JSONObject.toJSONString(object, SerializerFeature.WriteMapNullValue);
System.out.println(str);
}