对象映射DTO规则
2025/1/7大约 2 分钟
对象映射规则
eq 2.4.1+版本提供mapping-strategy提供三个选择,默认(之前版本)是COLUMN_ONLY,新版本提供了额外两种选择PROPERTY_FIRST和PROPERTY_ONLY和COLUMN_AND_PROPERTY
如果你无法理解那么请在新项目的时候选择PROPERTY_FIRST❗️
如果你无法理解那么请在新项目的时候选择PROPERTY_FIRST❗️
如果你无法理解那么请在新项目的时候选择PROPERTY_FIRST❗️
convert函数表示映射的列名,值为propertyName+nameConversion如果属性添加@Column(value="xx")则结果为xx
| 方法 | 描述 |
|---|---|
| PROPERTY_FIRST(推荐) | A.property == AVO.property 如果匹配不到并且AVO是函数则通过 convert(A.property)==convert(AVO.property)再次匹配比 |
| COLUMN_ONLY | convert(A.property)==convert(AVO.property) |
| PROPERTY_ONLY | A.property==AVO.property |
| COLUMN_AND_PROPERTY | findNull(convert(A.property),A.property)==findNull(convert(AVO.property),AVO.property) |
实体和结果
entity
public class A{
@Column(value="c")
private String a;
private String b;
}vo
public class AVO{
private String a;
private String b;
@Column(value="c")
private String d;
}COLUMN_ONLY(默认)
表示实体的对应的列名和映射对象的列名相同能映射
A.a->AVO.d
A.b->AVO.b
N/A->AVO.a
PROPERTY_FIRST
表示实体的对应的属性名和映射对象的属性名相同能映射,和PROPERTY_ONLY的区别就是如果是函数式片段没有property通过alias来匹配
A.a->AVO.a
A.b->AVO.b
N/A->AVO.d
PROPERTY_ONLY
表示实体的对应的属性名和映射对象的属性名相同能映射
A.a->AVO.a
A.b->AVO.b
N/A->AVO.d
COLUMN_AND_PROPERTY
表示先使用实体对应的列名匹配如果无法映射则使用属性名进行匹配
A.a->AVO.d
A.b->AVO.b
N/A->AVO.a
Solon 下如何全局修改
public static void main(String[] args) {
Solon.start(Main.class, args, app -> {
app.onEvent(EasyQueryBuilderConfiguration.class, configuration -> {
// COLUMN_ONLY: 默认策略, 表示实体的对应的列名和映射对象的列名相同能映射
configuration.replaceService(EntityMappingRule.class, ColumnEntityMappingRule.class);
// PROPERTY_ONLY: 表示实体的对应的属性名和映射对象的属性名相同能映射
configuration.replaceService(EntityMappingRule.class, PropertyEntityMappingRule.class);
// COLUMN_AND_PROPERTY: 表示先使用实体对应的列名匹配如果无法映射则使用属性名进行匹配
configuration.replaceService(EntityMappingRule.class, TryColumnAndPropertyEntityMappingRule.class);
// PROPERTY_FIRST: 推荐策略, 表示实体的对应的属性名和映射对象的属性名相同能映射,和PROPERTY_ONLY的区别就是如果是函数式片段没有property通过alias来匹配
configuration.replaceService(EntityMappingRule.class, PropertyFirstEntityMappingRule.class);
});
});
}