SpringBoot多表查询的实现

本文介绍在SpringBoot中如何实现多表查询并创建相应的实体类。通过两种方式实现:一是直接基于多表查询结果集设计实体类;二是创建视图后映射实体类。并给出具体代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在SpringBoot中,建立一个与单表结构相同的实体类,用
@Entity
@Table(name="user")

建立ORM映射,用@Column(name="name")建立字段映射。就可以用CrudRepository很方便地查询数据库表。但是我们经常需要查询多表关联的数据。如,有这样两个表:user和level。user中存放用户基本信息,level存放用户等级信息,user表中包含有level表的外键。如:

                                             

我们需要查出这样的结果:


由于数据库中没有这样的表,所以我们的实体类不能完全跟表建立映射,于是实体类就设计成这个样子:

@Entity
@Table(name="user")
public class UserModel {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long id;
    @Column(name="name")
    public String name;
    @Column(name="password")
    public String password;
    //这个字段不做映射
    public String level;
}

接口中的方法是这样的:

@Query(value = "SELECT u.id id,u.name name,u.password password,l.title level from user u,level l WHERE u.id=? and u.level=l.id", nativeQuery = true)
UserModel getUserAllInfo(long id);


在这里要说明的是,实体类中的字段映射并不是数据表,而是查到的结果集的结构。

我们看看查询结果:



其思路就是基于多表查询的结果集创建实体类,不属于数据表中的字段就不设置字段映射。

另外一种思路,就是在数据库中根据多表查询语句创建一个视图,然后创建的实体类完全映射这个视图,查询的时候就查询这个视图。


设计的实体类就变成了这个样子:

@Entity
@Table(name="userallinfo")//这里映射的是视图
public class UserModel {
    //以下所有字段映射都依照视图
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long id;
    @Column(name="name")
    public String name;
    @Column(name="password")
    public String password;
    @Column(name = "level")
    public String level;
}

接口中的查询方法变成这样:

    //查询数据来源变成了视图
    @Query(value = "SELECT * from userallinfo WHERE id=?", nativeQuery = true)
    UserModel getUserAllInfo(long id);

查询结果和前面相同。

以上解决方法依赖于SQL,并没有很好地发挥ORM的长处。更专业的处理方法还需要参考这篇文章:

http://blog.youkuaiyun.com/liujianwd/article/details/75305103

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值