Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BEP 55:实体类 内嵌对象 与 列表 #55

Open
troyzhxu opened this issue Jun 21, 2022 · 3 comments
Open

BEP 55:实体类 内嵌对象 与 列表 #55

troyzhxu opened this issue Jun 21, 2022 · 3 comments
Labels

Comments

@troyzhxu
Copy link
Owner

troyzhxu commented Jun 21, 2022

实体类内 支持嵌套 对象

用法1:内嵌对象

@SearchBean(tables="user u, profile p", joinCond="u.id = p.user_id")
public class User {

    // 和主表数据在同一个 SQL 查出来,参数 value=p 指定该对象的数据来自 profile 表
    @DbFiled(type=DbType.INLINE, value="p")
    private Profile profile;        

    // 省略其它...
}

public class Profile {

    private String address;

    // 省略其它...
}

用法2:内嵌列表

@SearchBean(tables="user u, user_role ur, role r", joinCond="u.id = ur.user_id and ur.role_id = r.id")
public class User {

    private Long id;

    // 类似 mybatis 的 <collection> 标签
    // 和主表数据在同一个 SQL 查出来,value=r 指定该集合的数据来自 role 表
    @DbFiled(type=DbType.COLLECTION, value="r")
    private List<Role> roles;

    // 省略其它...
}

public class Role {

    private Long id;

    // 省略其它...
}
@senphu
Copy link

senphu commented Jun 21, 2022

我觉得,由于无论多复杂的sql,最终出来的肯定是一个二维数组。
无论是一对多、多对多、都是查询结果的下一步交给用户自己进行再次转换的过程,BS不需要去像ORM那样去处理这种映射。

我有个想法:

@SearchBean(tables="user")
public class User {
    private Long id;
    private String name;
    // 省略其它...
}

@SearchBean(tables="profile")
public class Profile {
    private Long userId;
    private String address;
    // 省略其它...
}

@SearchBean(tables="user u, profile p", joinCond="u.id = p.user_id")
public class UserJoinProfileDO {

    // todo 想办法声明joinCond的模版变量的传入
     
     @DbFiled(type=DbType.ALIAS, value="u")
    private User user; 
    
    @DbFiled(type=DbType.ALIAS, value="p")
    private Profile profile;        

    // 省略其它...
}

想法:

  1. 从编码角度可以避免对象泛滥, 能重用单表的entity搭积木
  2. select u.* , p.* 是比较容易通过 prefix 加 点号去找到对应的字段进行赋值。
  3. 查询条件的表达有点繁琐: builder.field(new UserJoinProfileDO().getPreUsers()::getUsername, "x"); 而且还要对@DbFiled改造一下才能支持,不然 field传进去的不是FieldFn对象, 要能重用 单表对象里的字段做查询条件,得费很大功夫。

其余未尽,群里讨论吧

@troyzhxu troyzhxu changed the title BEP 55:实体类 嵌套 BEP 55:实体类 内嵌对象 与 列表 Jun 23, 2022
@chaoge6468
Copy link

+1

@Yq800822
Copy link

+2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants