# 2.0 chain 使用方式

//      原模型 增加 @JoinChainModel 注解 
//      生成规则是 原模型名称后+ Chain 比如说 原模型名字叫 Users 生成的类就叫做 UsersChain
        UsersChain usersChain = UsersChain.create();
        UsersAgeChain ageChain = UsersAgeChain.create();
        
//        注意字段定义 _Field 开头的代表是单个字段,一般用在单个类型定义的时候
//        例如:.eq(usersChain._ageId(),1)
        Joins.chain(usersChain)
                .selectAs(() -> {
                return usersChain.userId().userName().createTime();
                })
                        .leftJoin(ageChain._id(), usersChain._ageId())
//                joinand 第一个参数为需要进行 joinAnd的 子表Chain 模型
                .joinAnd(ageChain, (w) -> w.eq(ageChain._id(1)))
//                第一个值为 vo的字段,第二个值为 chain模型,这种默认查全部字段
                .oneToOneSelect(UsersVo::getUsersAge, ageChain)
//              如果只查几个字段,可以这样写
                .oneToOneSelect(UsersVo::getUsersAge, () -> {
                    return ageChain.ageDoc().ageName().id();
                })
                .joinList(UsersVo.class);

// 生成SQL
        SELECT
            users.user_id,
            users.user_name,
            users.create_time,
            users_age.age_doc AS users_age_age_doc,
            users_age.age_name AS users_age_age_name,
            users_age.create_time AS users_age_create_time,
            users_age.content_json_age AS users_age_content_json_age,
            users_age.id AS users_age_id
        FROM
            users AS users
        LEFT JOIN users_age AS users_age ON users_age.id = users.age_id
        AND ( users_age.id = 1 )

# lambda使用方式

# 一对一查询映射

很多时候连表返回的字段很多都相同,所以在每个vo里面都会出现,如果把这些重复性字段封装成一个类,会更好维护,所以说针对这个情况 版本 >= 1.0.6 即可使用oneToOneSelect 方法

 oneToOneSelect(SFunction<P, ?> column, Class<?> modelClass) (version >= 1.3.3)
 oneToOneSelect(SFunction<P, ?> column, Consumer<ColumnsBuilder<T>> consumer)

 JoinLambdaWrapper<Users> wrapper = joinLambdaQueryWrapper(Users.class);

 wrapper.leftJoin(UsersAge.class, UsersAge::getId, Users::getAgeId)
   // oneToOneSelect 第一个参数需要映射的实体类字段,第二个参数则是查询函数
        .oneToOneSelect(UsersVo::getUsersAge, (cb) -> {
             cb.add(UsersAge::getAgeDoc, UsersAge::getAgeName)
               /* 
              当你出现两个实体类映射字段相同,例如 user实体中有个字段id,userAge表中也有个字段id,你									
              想要同时获取这两个字段,这时候则可以使用
               |column : 查询字段
               |alias  : 别名
							 |fieldName : 字段名称
               add(SFunction<T, ?> column, String alias, SFunction<F, ?> fieldName)
               */
               .add(UsersAge::getId, "ageId", UsersAge::getId)
          		// 在1.3.2版本后 属性名和映射vo的属性名相同的情况下,可以不必写别名,就可以完成自动映射
          	 .add(UsersAge::getId);
         })
   .end();


  super.joinList(wrapper, UsersVo.class);

// 执行SQL 
SELECT users.user_name, users.create_time, users.age_id, users.user_id, users_age.age_doc
	, users_age.age_name, users_age.id AS ageId
FROM users users
	LEFT JOIN users_age users_age ON users_age.id = users.age_id
  
// 返回结果
[
  {
   "ageId":1,
   "createTime":1635416270000,
   "userId":1,
   "userName":"名字啊",
   "usersAge":{
     "ageDoc":"90",
     "ageName":"90",
     "id":1
   }
  }....
]

在1.3.3版本之后使用方式就简单了许多


 JoinLambdaWrapper<Users> wrapper = joinLambdaQueryWrapper(Users.class);

 wrapper.leftJoin(UsersAge.class, UsersAge::getId, Users::getAgeId)
    // 1.3.3版本之后可以 这样子查询这个类的所有查询字段并赋值到对象中
     .oneToOneSelect(UsersVo::getUsersAge,UsersAge.class).end();