# easy-join
**Repository Path**: wrxfxdd/easy-join
## Basic Information
- **Project Name**: easy-join
- **Description**: `easy-join` 是一个基于Java注解的自动外键转换/翻译工具,它能够在JSON序列化过程中自动查询并填充关联表的字段值,极大简化了数据关联查询的开发工作。
关联:外键自动转换、关联表自动填充、JSON序列化增强、数据库关联查询优化、一对一关联转换、一对多关联转换、自动关联数据获取、注解式外键处理
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 0
- **Created**: 2025-10-11
- **Last Updated**: 2025-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# easy-join
## 项目介绍
easy-join 是一个基于注解的自动外键翻译工具:引入依赖,无需额外配置,只声明“要补哪些字段”,序列化输出时自动补齐,不改变现有实体结构。
## 项目优势
- **注解驱动、零侵入**:不改表结构/实体结构,不影响原有查询逻辑
- **批处理预取**:对列表/数组序列化自动汇总外键并批量查询,显著减少 N+1
- **一对一 / 一对多**:`@EasyJoinOne` / `@EasyJoinList`
- **按需字段**:`@SelectColumn` 精确选择字段与别名(支持下划线/驼峰写法)
- **瞬时缓存**:内置 Caffeine,全局 5 秒过期(默认开启,可关闭)
## 适用场景
- **列表/分页接口**:返回一批对象,需要补充关联字段(收益最大)
- **快速开发**:减少 DTO 拼装与手写 join 的成本
- **关系简单~中等复杂度**:外键字段明确、关联字段可控
## 如何使用
### 1. 引入依赖
在项目的 `pom.xml` 中添加依赖:
jdk 8版本
```xml
io.gitee.wrxfxdd
easy-join
1.0.1
```
jdk 17版本
```xml
io.gitee.wrxfxdd
easy-join
17.0.1
```
### 2. 直接使用
#### 一对一关联示例
##### 正常情况
```java
public class Order {
private Long id;
@EasyJoinOne(target = UserInfoDO.class)
@SelectColumn(column = "name")
@SelectColumn(column = "phone")
private Long userId;
}
```
序列化后 JSON 示例:
```json
{
"id": 1,
"userId": 1001,
"name": "张三",
"phone": "13800138000"
}
```
##### 特殊情况:
1.userId 对应 UserInfoDO 的 其他字段比如就叫userId或者 userNo 就需要指定对应的字段
2.查询的字段名和当前实体类有重名,可以通过注解属性中as取别名
```java
public class Order {
private Long id;
@EasyJoinOne(target = UserInfoDO.class, joinColumn = "userNo")
@SelectColumn(column = "name", as = "userName")
@SelectColumn(column = "phone", as = "userPhone")
private Long userId;
}
```
序列化后 JSON 示例:
```json
{
"id": 1,
"userId": 1001,
"userName": "张三",
"userPhone": "13800138000"
}
```
#### 一对多关联示例
##### 正常情况
```java
public class User {
private Long id;
@EasyJoinList(target = UserInfoDO.class)
@SelectColumn(column = "name")
@SelectColumn(column = "phone")
private Long userId;
}
```
序列化后 JSON 示例:
```json
{
"id": 1001,
"userId": 1001,
"userInfoDOList": [
{
"name": "张三",
"phone": 21321312
},
{
"name": "李四",
"phone": 199924234
}
]
}
```
##### 特殊情况
1.userId 对应 UserInfoDO 的 其他字段比如就叫userId或者 userNo 就需要指定对应的字段
2.查询的字段名想取别名 可以通过注解属性中as取别名
```java
public class User {
private Long id;
@EasyJoinList(target = UserInfoDO.class, joinColumn = "userNo")
@SelectColumn(column = "name", as = "userName")
@SelectColumn(column = "phone", as = "userPhone")
private Long userId;
}
```
序列化后 JSON 示例:
```json
{
"id": 1001,
"userId": 1001,
"userInfoDOList": [
{
"name": "张三",
"phone": 21321312
},
{
"name": "李四",
"phone": 199924234
}
]
}
```
## 注解说明
### @EasyJoinOne
用于一对一关联外键转换。
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| target | Class | 否 | Void.class | 目标 DO/实体类(tableName 为空时用于推导表名) |
| tableName | String | 否 | "" | 关联表名(优先级高于 target) |
| joinColumn | String | 否 | "id" | 外键对应表的字段名(支持驼峰/下划线) |
| selectColumns | SelectColumn[] | 否 | {} | 兼容老写法(推荐改用字段上的重复 @SelectColumn) |
| cache | boolean | 否 | true | 是否启用缓存 |
### @EasyJoinList
用于一对多关联外键转换。
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| target | Class | 否 | Void.class | 目标 DO/实体类(tableName 为空时用于推导表名) |
| tableName | String | 否 | "" | 关联表名(优先级高于 target) |
| joinColumn | String | 否 | "id" | 目标表中用于匹配外键值的字段(一般需要手动指定) |
| as | String | 否 | "" | 输出数组字段名;为空时默认生成:`xxxList` |
| selectColumns | SelectColumn[] | 否 | {} | 兼容老写法(推荐改用字段上的重复 @SelectColumn) |
| cache | boolean | 否 | true | 是否启用缓存 |
### @SelectColumn
指定要查询的字段及别名。
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| column | String | 是 | - | 列名(支持下划线/驼峰;查询时会转为下划线) |
| as | String | 否 | "" | JSON 输出别名;不指定则:下划线列名转驼峰、驼峰列名保持不变 |
## 性能机制(已内置)
- **批处理预取**:集合/数组序列化时先预扫描元素,按 `tableName + joinColumn` 汇总外键值并批量查询,减少 N+1
- **瞬时缓存**:Caffeine 全局缓存,默认 `maximumSize=2000`、`expireAfterWrite=5s`,key 形如 `表名:外键字段:外键值`
## 注意事项
1. **触发时机**:主要在对象序列化输出时触发(例如接口返回 JSON)
2. **索引建议**:建议为 `joinColumn` 建索引;超大列表建议分页返回
3. **一对一多行**:若一对一查询返回多条记录,会默认取第一条并记录警告日志
## License
MIT License