# 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模型,这种默认查全部字段
                .manyToManySelect(UsersVo::getUsersAges, ageChain)
//              如果只查几个字段,可以这样写
                .manyToManySelect(UsersVo::getUsersAges, () -> {
                    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使用方式

# 多对多查询映射

manyToManySelect 多对多,对应的就是 mybatis中的resultMap中的collection标签

// version >= 1.3.3
manyToManySelect(SFunction<P, ?> column, Class<?> manyToManyClass) 
/*
该方法第一个参数代表的是需要映射到的实体类字段
第二个参数代表list中的实体类型 例如 List<Users> 这里的实体类型就是Users
第三个就是要查询的字段
*/
manyToManySelect(SFunction<P, ?> column, Class<?> manyToManyClass, Consumer<ColumnsBuilder<T>> consumer)

示例:

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

wrapper.leftJoin(Users.class, Users::getAgeId, UsersAge::getId)
        .manyToManySelect(UsersAgesVo::getUsersList, Users.class, (cb) -> {
          	// 在1.3.2版本后 属性名和映射vo的属性名相同的情况下,可以不必写别名,就可以完成自动映射
           cb.add(Users::getUserName, Users::getUserId, Users::getCreateTime);
         }).end();
super.joinList(wrapper, UsersAgesVo.class);

// 执行SQL
SELECT 		   
 users_age.age_doc,users_age.age_name,users_age.id,users.user_name,users.user_id,users.create_time
FROM users_age AS users_age
	LEFT JOIN users AS users ON users.age_id = users_age.id;

// 返回数据
[
  {"ageDoc":"90","ageName":"90","id":1,
   "usersList":[
     {"createTime":1635416270000,"userId":1,"userName":"名字啊"},
     {"createTime":1635416270000,"userId":2,"userName":"名字2"}
   ]
  }
]

1.3.3版本之后可以 这样子查询这个类的所有查询字段并赋值到集合对象中

manyToManySelect(UsersAgesVo::getUsersList,Users.class)

和上面的效果是一样的