数据库表 mybatisplus中我需要将四张表通过关系表获取到信息,例如 用户表 朋友表 家庭表 公司表 关系表 通过用户表的用户id 获取到 用户表 朋友表 家庭表 公司表的 所有信息 在一个sql语句内完成 但是只有用户表跟连接表中有用户名称 所有信息 都是通过关系表关联
时间: 2023-09-06 19:10:06 浏览: 91
在SQL中,你为达此目的将需要进行一个四表连接的查询。
可以使用 MyBatis-Plus 的 `@Table` 和 `@JoinTable` 注解来实现多表关联查询。
假设用户表为 `user`,朋友表为 `friend`,家庭表为 `family`,公司表为 `company`,关系表为 `user_relation`,其中 `user_relation` 表中包含着用户表和朋友表、家庭表、公司表的关联信息。
首先需要在 Java 实体类中定义好表的关系,示例代码如下:
```java
@Table("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
@JoinTable(type = JoinType.LEFT_JOIN, clazz = UserRelation.class, on = "id = user_id")
private List<UserRelation> userRelations;
}
@Table("friend")
public class Friend {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
@JoinTable(type = JoinType.LEFT_JOIN, clazz = UserRelation.class, on = "id = friend_id")
private List<UserRelation> userRelations;
}
@Table("family")
public class Family {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
@JoinTable(type = JoinType.LEFT_JOIN, clazz = UserRelation.class, on = "id = family_id")
private List<UserRelation> userRelations;
}
@Table("company")
public class Company {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
@JoinTable(type = JoinType.LEFT_JOIN, clazz = UserRelation.class, on = "id = company_id")
private List<UserRelation> userRelations;
}
@Table("user_relation")
public class UserRelation {
@TableId(type = IdType.AUTO)
private Long id;
private Long userId;
private Long friendId;
private Long familyId;
private Long companyId;
}
```
其中,`@Table` 注解中的参数为表名,`@TableId` 注解指定了主键的类型和生成策略,`@JoinTable` 注解指定了关联的类型、关联的实体类和关联的条件。
接下来就可以编写查询 SQL 语句了,示例代码如下:
```java
@Select("SELECT u.*, f.*, c.*, fr.* FROM user u " +
"LEFT JOIN user_relation ur ON ur.user_id = u.id " +
"LEFT JOIN friend fr ON fr.id = ur.friend_id " +
"LEFT JOIN family f ON f.id = ur.family_id " +
"LEFT JOIN company c ON c.id = ur.company_id " +
"WHERE u.id = #{userId}")
User getUserWithRelations(@Param("userId") Long userId);
```
这段 SQL 语句中,通过 `LEFT JOIN` 连接了 `user` 表、`user_relation` 表、`friend` 表、`family` 表、`company` 表,根据 `user_id` 条件筛选出了对应的数据,并将结果映射到 `User` 实体类中。可以看到,这里没有使用 `SELECT *`,而是通过指定需要查询的字段来提高查询效率。
最后,就可以在业务代码中调用 `getUserWithRelations` 方法来获取用户及其相关信息了。
阅读全文