跳至主要內容

关联查询 Include

xuejmnet大约 4 分钟

easy-query 1.2.1+ 支持关联查询,支持多级关联查询,并且只支持first和tolist两个返回方法,支持vo对象返回支持include追加追踪、禁止、逻辑删除、where过滤、order、limit等一系列处理,但是返回结果必须是数据库对象实例(include方法内部),如果需要额外字段返回可以使用columnInclude/columnIncludeMany自定义返回

说明!!!

OneToOneManyToOne有着天然的区别,比如每条记录都有一个创建人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();

感谢!!!

以下关系图有网友 糊搞open in new window 大佬提供十分感谢

一对一说明

多对一说明

一对多说明

多对多说明

多次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();
属性是否必填默认值描述
valuetrue-表示当前对象和目标对象的关系RelationTypeEnum枚举
selfPropertyfalse-当前对象的哪个属性关联目标对象,空表示使用当前对象的主键
targetPropertyfalse-当前对象的selfProperty属性关联目标的哪个属性,空表示使用目标对象的主键
mappingClassfalseObject.class中间表对象,必须是表对象实体字节
selfMappingPropertyfalse多对多必填-当前对象的selfProperty属性对应中间表的哪个属性,多对多不能为空
targetMappingPropertyfalse多对多必填-目标对象的targetProperty属性对应中间表的哪个属性,多对多不能为空
orderByPropsfalse-默认的子对象排序行为(建议ToMany设置)
offsetfalse0子对象拉取偏移量(建议ToMany设置)
limitfalse0子对象拉取量(建议ToMany设置)
extraFilterfalseDef.class子对象条件额外条件比如班级和学生额外可以再多两个属性男学生和女学生,则可以通过该属性进行分类

更多案例

点击查看更多案例

上次编辑于:
贡献者: xuejiaming,Hoysing