queryWrapper处理一对一,一对多,多对多

这篇具有很好参考价值的文章主要介绍了queryWrapper处理一对一,一对多,多对多。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SELECT
bu.ID AS id,
bu.FULLNAME AS fullName,
bu.ID_NUMBER AS idNumber,
bu.MOBILE AS Mobile,
bu.USER_TYPE AS userType,
bc.BANK_CODE AS bankCode,
bc.BANK_NAME AS bankName,
bc.CARD_NUMBER AS cardNumber,
bc.PASSWORD AS password
FROM
bank_user AS bu
LEFT JOIN
(
bank_card AS bc
)
ON
bu.ID = bc.USER_ID
WHERE
bu.ID = 1 ; 将这段代码换成queryWrapper的写法,结果返回userdetailDTO对象,此对象包含所有查询的字段

是的,定义一个 BankUser 对象时,通常需要在其内部定义一个 BankCard 字段来表示其与 bank_card 表的关联关系。

例如,在 BankUser 类中定义一个 BankCard 对象作为其属性:```java

public class BankUser {
    private Long id;  // 用户 ID
    private String fullName;  // 用户名
    // 其他属性...

    private BankCard bankCard;  // 与 bank_card 表的关联关系

    // Getter 和 Setter 方法...
}


```

然后,在查询 BankUser 对象时,需要使用 LEFT JOIN 将 bank_user 和 bank_card 表进行关联,并使用 select 方法指定需要查询的字段:

```java

QueryWrapper<BankUser> queryWrapper = new QueryWrapper<>();
queryWrapper.select("b.ID", "b.FULLNAME", "c.BANK_CODE", "c.BANK_NAME", "c.CARD_NUMBER")
        .eq("b.ID", 1L)
        .last("LEFT JOIN bank_card c ON b.ID = c.USER_ID");
BankUser bankUser = bankUserService.getOne(queryWrapper);


```

这样查询出来的 BankUser 对象中就会包含一个 BankCard 对象,可以使用 getBankCard 方法获取它:

```java

BankCard bankCard = bankUser.getBankCard();


```

getBankCard 方法的实现可以简单地返回实例变量 bankCard。

需要注意的是,如果使用 MyBatisPlus 进行相关的代码生成,其会自动生成 Entity 类和相关的 Mapper 接口。在 Entity 中,会将两个表的字段映射成对应的属性,而 Mapper 接口中则会自动生成基本的 CRUD 方法。可以基于这些接口和类进行后续的开发工作。

好的,下面是将该 SQL 转换为使用queryWrapper的 Java 代码,并返回 UserDetailDTO 对象的示例代码:```java

QueryWrapper<BankUser> queryWrapper = new QueryWrapper<>();
queryWrapper.select("ID AS id", "FULLNAME AS fullName", "ID_NUMBER AS idNumber",
        "MOBILE AS Mobile", "USER_TYPE AS userType", "BANK_CODE AS bankCode",
        "BANK_NAME AS bankName", "CARD_NUMBER AS cardNumber", "`PASSWORD` AS `password`")
        .eq("bu.ID", 1L)
        .last("LEFT JOIN bank_card AS bc ON bu.ID = bc.USER_ID");
BankUser bankUser = bankUserService.getOne(queryWrapper);

UserDetailDTO userDetailDTO = new UserDetailDTO();
BeanUtils.copyProperties(bankUser, userDetailDTO);

if (bankUser.getBankCard() != null) {
    BankCard bankCard = bankUser.getBankCard();
    userDetailDTO.setBankCode(bankCard.getBankCode());
    userDetailDTO.setBankName(bankCard.getBankName());
    userDetailDTO.setCardNumber(bankCard.getCardNumber());
    userDetailDTO.setPassword(bankCard.getPassword());
}
return userDetailDTO;


```

在代码中,首先使用 QueryWrapper 构建了 SQL 查询语句。其中 select 方法用于指定需要查询的字段,eq 方法指定查询条件。last 方法则用于指定表的连接方式,可以使用任意 SQL 语句,这里使用了 LEFT JOIN。

接着,调用 bankUserService 的 getOne 方法执行查询,并将查询结果转换为 UserDetailDTO 对象,这里使用了 Spring 框架提供的 BeanUtils.copyProperties 方法进行转换。

最后,如果查询结果中包含 BankCard 对象,则从 BankCard 对象中取出相应的字段并设置到 UserDetailDTO 对象中。

这样就可以非常简单地实现将该 SQL 语句转换为使用 QueryWrapper 的 Java 代码,并返回 UserDetailDTO 对象了。

下面是一对多

如果你不想使用中间表实现 BankUser 和 BankCard 之间的多对多关系,可以考虑使用一对多和多对一的关联,这需要在 BankUser 中定义一对多关系,为 BankCard 定义多对一关系,例如:

public class BankUser {
    private Long id;
    private String fullName;
    // 其他属性...

    // 一对多关联,一个 BankUser 对象可以对应多个 BankCard 对象
    private List<BankCard> bankCardList; 

    // Getter 和 Setter 方法...
}

public class BankCard {
    private Long id;
    private String bankCode;
    private String bankName;
    private String cardNumber;
    // 其他属性...

    // 多对一关联,一个 BankCard 对象对应一个 BankUser 对象
    private BankUser bankUser;

    // Getter 和 Setter 方法...
}

在定义实体类之后,可以使用 MyBatisPlus 提供的 @TableField 和 @TableId 注解来标注类的属性与数据库表中的字段的对应关系:

public class BankUser {
    // 属性定义...
    @TableField(exist = false)  // 表示该属性在数据库表中不存在
    private List<BankCard> bankCardList;
    // getter 和 setter 方法...
}

public class BankCard {
    // 属性定义...
    @TableField("user_id")  // 表示该属性对应数据库表中的 user_id 字段
    private Long userId;
    // 与 BankUser 之间的多对一关系
    @TableField(exist = false)  // 表示该属性在数据库表中不存在
    private BankUser bankUser;
    // getter 和 setter 方法...
}

在查询 BankUser 时,可以在查询对象 QueryWrapper 中通过 lambda 表达式指定 BankUser 对象需要关联查询 BankCard 对象,并使用 select 方法指定需要查询的字段:

QueryWrapper<BankUser> queryWrapper = new QueryWrapper<>();
queryWrapper.select("b.ID", "b.FULLNAME", "c.BANK_CODE", "c.BANK_NAME", "c.CARD_NUMBER")
    .eq("b.ID", 1L)
    .lambda()
    .leftJoin(BankCard.class, BankCard::getUserId, BankUser::getId)
    .eq(BankCard::getDeleted, 0);
BankUser bankUser = bankUserService.getOne(queryWrapper);

查询结果中,BankUser 对象中的 bankCardList 属性会包含多个 BankCard 对象。需要注意的是,在定义关联关系时,需要通过@TableField注解表明它们所对应的数据库表中的字段。

下面是多对多:

如果 bankUser 和 bankCard 是多对多的关系,那么它们之间是存在中间表的。通常情况下,中间表中除了两个表的主键外,还会包含其他的一些字段,比如创建时间、修改时间等。因此,类的定义中就需要引入一个中间实体类。

假设 bankUser 和 bankCard 是多对多关系,中间表名为 user_card,那么我们可以定义如下的实体类:

public class BankUser {
    private Long id;
    private String fullName;
    // 其他属性...

    // 与中间表 user_card 的关联关系,通过中间表关联 bank_card 表
    private List<UserCard> userCardList;

    // Getter 和 Setter 方法...
}

public class BankCard {
    private Long id;
    private String bankCode;
    private String bankName;
    private String cardNumber;
    // 其他属性...

    // 与中间表 user_card 的关联关系,通过中间表关联 bank_user 表
    private List<UserCard> userCardList;

    // Getter 和 Setter 方法...
}

public class UserCard {
    private Long id;
    private Long userId;  // 与 bank_user 表的外键关联
    private Long cardId;  // 与 bank_card 表的外键关联
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
    // 其他属性...

    // Getter 和 Setter 方法...
}

在定义实体类后,我们可以使用 MyBatisPlus 提供的 @TableField 和 @TableId 注解来标注类的属性与数据库表中的字段的对应关系。具体来说,BankUser 和 BankCard 类中的 userCardList 属性对应的是 UserCard 类的 userId 和 cardId 字段。它们的定义可能如下所示:

public class BankUser {
    // 属性定义...
    @TableField(exist = false)  // 表示该属性在数据库表中不存在
    private List<UserCard> userCardList;
    // getter 和 setter 方法...
}

public class BankCard {
    // 属性定义...
    @TableField(exist = false)  // 表示该属性在数据库表中不存在
    private List<UserCard> userCardList;
    // getter 和 setter 方法...
}

public class UserCard {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @TableField("user_id")
    private Long userId;
    @TableField("card_id")
    private Long cardId;
    @TableField("create_time")
    private LocalDateTime createTime;
    @TableField("update_time")
    private LocalDateTime updateTime;
    // 其他属性...
    // getter 和 setter 方法...
}

在查询 BankUser 时,可以通过 LEFT JOIN 将 bank_user、user_card 和 bank_card 三张表关联起来,并使用 select 方法指定需要查询的字段:

QueryWrapper<BankUser> queryWrapper = new QueryWrapper<>();
queryWrapper.select("b.ID", "b.FULLNAME", "c.BANK_CODE", "c.BANK_NAME", "c.CARD_NUMBER",
        "uc.CREATE_TIME", "uc.UPDATE_TIME")
    .eq("b.ID", 1L)
    .last("LEFT JOIN user_card uc ON b.ID = uc.USER_ID LEFT JOIN bank_card c ON uc.CARD_ID = c.ID");
BankUser bankUser = bankUserService.getOne(queryWrapper);

查询结果中,BankUser 对象中的 userCardList 属性会包含多个 UserCard 对象,每个 UserCard 对象中则包含了与之关联的 BankCard 对象和 BankUser 对象。

需要注意的是,如果使用 MyBatisPlus 进行相关的代码生成,其会自动生成实体类、Mapper 接口和中间表对应的 Service 和 Mapper 接口。可以基于这些接口和类进行后续的开发工作。文章来源地址https://www.toymoban.com/news/detail-440011.html

到了这里,关于queryWrapper处理一对一,一对多,多对多的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 杨中科 .NETCORE EFCORE第七部分 一对一,多对多

    1、builder.HasOne(o =o.Delivery).WithOne(d=d.Order).HasForeignKey(d=dOrderId); 2、测试插入和获取数据 示例 新建 Order 新建 Delivery DeliveryConfig OrderConfig 执行 迁移命令 查看数据库 测试数据插入 运行查看数据 1、多对多:老师一学生 2、EF Core 5.0开始,才正式支持多对多 3、需要中间表,举例数据

    2024年01月17日
    浏览(45)
  • Django基础入门⑪:DjangoDjango数据表关联(一对一,一对多,多对多关系)

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 Django数据表关

    2024年02月12日
    浏览(63)
  • websocket 局域网 webrtc 一对一 多对多 视频通话 的示例

    基本介绍 WebRTC(Web Real-Time Communications)是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC 包含的这些标准使用户在无需安装任何插件或者第

    2024年04月28日
    浏览(49)
  • MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询

    MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询 MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询 com.github.dreamyoung mprelation 0.0.3.2-RELEASE 注解工具使用优缺点: 优点: 使用简单,通过在实体类上添加@OneToOne / @OneToMany / @ManyToOne / @ManyToM

    2024年01月20日
    浏览(57)
  • Mybatis:一对一查询映射处理

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! MyBatis是一种流行的Java持久化框架,它提供了灵活而强大的查询映射功能。在一些复杂的数据模型中

    2024年02月14日
    浏览(43)
  • Tcp server是如何一个端口处理多个客户端连接的(一对一还是一对多)

    我们经常看到说,TCP 是一对一的两点服务,UDP 支持一对一、一对多、多对多的交互通信。但是使用Tcp工具通讯时,一个Tcp服务端可以连接多个Tcp客户端。所以这里的一对一和一对多是不是冲突了? 并不是 。一对一指的是Tcp连接,什么是Tcp连接,这里直接粘贴小林大神的解释

    2023年04月08日
    浏览(49)
  • [Django-04]一对一,一对多

    OneToOneField(),ForeignKey() 的参数如下 to 要连接的模型 to_field 要被关联的目标Model的字段 on_delete 删除主表(被关联的表,也就是非OneToOneField,ForeignKey的表)时,当前表怎么处理。 CASCADE-联动删除 PROTECT -抛出异常 SET_NULL-设为null SET_DEFAULT-设为预定义的默认值 SET-设置为指定的值

    2024年02月04日
    浏览(53)
  • [Mybatis的一对一和一对多]

    目录  🎂前言:  🎂一对一关联查询:  🎂一对多关联查询:  🎂 下面是上面代码中所涉及到的实体类结构设计:  🎂一对一关联查询:  🎂用户实体类(User):  🎂用户详情实体类(UserDetail):  🎂一对多关联查询:  🎂订单实体类(Order):  🎂订单详情实体类

    2024年02月12日
    浏览(48)
  • [MySql]实现多表查询-一对一,一对多

    目录 多表关联关系的分类 mybatis中的多表查询: 数据库准备  项目目录  一对一查询(多对一) 方式一:(xml文件映射) 查询结果:  方式二:(注解映射)  一对多查询(一对多) 方式一:(xml文件映射)  方式二:(注解映射) 既然数据库是存储项目中的数据的,项目中的

    2023年04月10日
    浏览(56)
  • TCP一对一聊天

    客户端 服务端  结果展示  第二种 客户端 服务端 结果

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包