关联查询 Include
大约 4 分钟
easy-query
1.2.1+ 支持关联查询,支持多级关联查询,并且只支持first和tolist两个返回方法,支持vo对象返回支持include
追加追踪、禁止、逻辑删除、where过滤、order、limit等一系列处理,但是返回结果必须是数据库对象实例(include方法内部),如果需要额外字段返回可以使用columnInclude
/columnIncludeMany
自定义返回
说明!!!
OneToOne
和ManyToOne
有着天然的区别,比如每条记录都有一个创建人id,如果你添加创建人关系对象到记录对象里面,那么应该设置ManyToOne
表示多条记录都会有这个创建人,而不是OneToOne
,如果您设置OneToOne
那么如果2条记录有相同的创建人则只会有一个创建人被关联上,具体可以反向推导比如一个人有多少条记录很明显是OneToMany
那么反过来就是ManyToOne
类型 | 描述 | 场景 |
---|---|---|
OneToOne | 一对一 | 学生和学生家庭信息 |
OneToMany | 一对多 | 班级和学生 |
ManyToOne | 多对一 | 学生和班级 |
ManyToMany | 多对多 | 班级和老师 |
List<SchoolClass> classes = easyEntityQuery.queryable(SchoolClass.class)
//查询班级并且连带查询每个班级最先入学的前5位学生
.includes(o -> o.schoolStudents(),x->x.orderBy(u->u.createTime().asc()).limit(5))
.toList();
感谢!!!
以下关系图有网友
糊搞
大佬提供十分感谢
一对一说明
多对一说明
一对多说明
多对多说明
多次include
多关联查询
说明!!!
include
内部属于独立查询,如果您需要差异更新并且没有配置默认启动追踪查询那么需要独立进行asTracking()
等,include的后one或者many的第二个参数表示以多少关联属性为一组进行获取
对象模式include/includes
参数说明 其中如果您的导航属性是ToOne
那么请使用include
如果是ToMany
那么是includes
包含的两个参数第一个参数表示你要返回的导航属性,第二个参数表示对返回导航属性如何进行增强
List<SchoolClass> list = easyEntityQuery.queryable(SchoolClass.class)
//表示查询学校班级的同时附带查询出班级的老师
.includes(s -> s.schoolTeachers())
//查询学校班级的同时附带查询出班级的学生(这个学生是每个班级年龄最大的三个)并且返回的学生也需要返回学生地址
.includes(s -> s.schoolStudents(),x->{
x.include(y->y.schoolStudentAddress())
.orderBy(y->y.age().desc())
.limit(3);
})
.where(s -> {
s.name().eq("一班");
}).toList();
List<SchoolStudent> list = easyEntityQuery.queryable(SchoolStudent.class)
//一对一查询启用追踪并且对子查询逻辑删除禁用
.include(o -> o.schoolClass(),q->q.asNoTracking().disableLogicDelete())
.toList();
List<SchoolStudent> list2 = easyEntityQuery.queryable(SchoolStudent.class)
//一对一查询启用追踪并且对子查询逻辑删除禁用
//如果查询学生有20个以上假如21个那么会先用20个id进行in查询,再用1个id进行查询最后进行合并
.include(o -> o.schoolClass(),20)
.toList();
List<SchoolStudent> list1 = easyQuery.queryable(SchoolStudent.class)
//一对一查询启用追踪并且对子查询逻辑删除禁用
.include(o -> o.one(SchoolStudent::getSchoolStudentAddress).asTracking().disableLogicDelete())
.toList();
List<SchoolStudent> list1 = easyQuery.queryable(SchoolStudent.class)
//一对一查询启用追踪并且对子查询逻辑删除禁用
//如果查询学生有20个以上假如21个那么会先用20个id进行in查询,再用1个id进行查询最后进行合并
.include(o -> o.one(SchoolStudent::getSchoolStudentAddress,20))
.toList();
List<SchoolStudent> list1 = easyQueryClient.queryable(SchoolStudent.class)
//一对一查询启用追踪并且对子查询逻辑删除禁用
.include(o -> o.with("schoolStudentAddress").asTracking().disableLogicDelete())
.toList();
List<SchoolStudent> list1 = easyQueryClient.queryable(SchoolStudent.class)
//一对一查询启用追踪并且对子查询逻辑删除禁用
//如果查询学生有20个以上假如21个那么会先用20个id进行in查询,再用1个id进行查询最后进行合并
.include(o -> o.with("schoolStudentAddress",20))
.toList();
Navigate
属性 | 是否必填 | 默认值 | 描述 |
---|---|---|---|
value | true | - | 表示当前对象和目标对象的关系RelationTypeEnum 枚举 |
selfProperty | false | - | 当前对象的哪个属性关联目标对象,空表示使用当前对象的主键 |
targetProperty | false | - | 当前对象的selfProperty 属性关联目标的哪个属性,空表示使用目标对象的主键 |
mappingClass | false | Object.class | 中间表对象,必须是表对象实体字节 |
selfMappingProperty | false 多对多必填 | - | 当前对象的selfProperty 属性对应中间表的哪个属性,多对多不能为空 |
targetMappingProperty | false 多对多必填 | - | 目标对象的targetProperty 属性对应中间表的哪个属性,多对多不能为空 |
orderByProps | false | - | 默认的子对象排序行为(建议ToMany设置) |
offset | false | 0 | 子对象拉取偏移量(建议ToMany设置) |
limit | false | 0 | 子对象拉取量(建议ToMany设置) |
extraFilter | false | Def.class | 子对象条件额外条件比如班级和学生额外可以再多两个属性男学生和女学生,则可以通过该属性进行分类 |