当前位置: 首页 > 知识库问答 >
问题:

通过表达式映射列表元素的字段

百里芷阳
2023-03-14

下午好!有一个对象包含类型为List的字段,是否可以通过表达式参数在注释中生成的值来设置T类型的每个(某些)字段?

例如:

目标对象:

public class CustomList<T extends CustomEntity> extends CustomEntity {
    
    private List<T> field;
    
    public CustomList() {
        field = new ArrayList();
    }
}

映射器接口:

@Mapper
public interface Mapper {
    @Mapping(target = "java(field.foreach(f -> f.getId))", expression = "java(UUID.randomUUID().toString())")
    CustomList<SomeObject> map (Object object);
}

如何实现这样的想法?在文档中,我只找到了具有1:1映射的示例。

编辑:

此外,我尝试使用以下方法:

public class IterableNonIntegrableUtil {

  @SetElements
  public CustomList<SomeObject> map(Object object) {
    CustomList<SomeObject> customList= new CustomList<>();
    customList.getField()
        .forEach(item -> item.setUid(UUID.randomUUID().toString()));
    return customList;
  }}




@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface SetElements{}



Mapper interface:
@Mapper(uses = IterableNonIntegrableUtil.class)
    public interface Mapper {
        @Mapping(target = "field", souce = "object", 
qualifiedBy=SetElements.class)
        CustomList<SomeObject> map (Object object);}

但在这种情况下,我对限定符有一些错误。

共有1个答案

祝俊雄
2023-03-14

可以通过将对象映射到同一类型:

CustomList<SomeObject> map(CustomList<SomeObject> src);

// in case you only want to set the ones that are null.
@Mapping(target = "someField1", default = "someValue")
@Mapping(target = "someField2", defaultExpression = "java(someMethod())")
// in case you always want to set the value.
@Mapping(target = "someField3", constant = "someValue")
@Mapping(target = "someField4", expression = "java(someMethod())")
SomeObject map(SomeObject src);

我自己会考虑在构造对象的时候设置默认值。

例如:

class SomeObject {
    private String someField;

    /**
      * When called with a null or a blank value, the default value will be restored.
      */
    void setSomeField(String value) {
        // there is probably an utility out there which can make this a one-liner.
        if (value != null && !value.isBlank()){
            someField = value;
        } else {
            someField = "defaultValue";
        }
    }
}
 类似资料:
  • 以下各节讨论如何将表列和SQL表达式映射到各个对象属性。 映射表列 从属性名称清楚地命名列 从反射表自动化列命名方案 用前缀命名所有列 对列级别选项使用列属性 映射表列的子集 作为映射属性的SQL表达式 使用杂交种 使用列属性 在映射时从列属性合成 使用普通描述符 作为映射属性的查询时间SQL表达式 更改属性行为 简单验证器 在核心级别使用自定义数据类型 使用描述符和混合 同义词 操作员自定义 组

  • 表达式API由一系列类组成,每个类表示SQL字符串中的特定词汇元素。它们组合成一个更大的结构,形成一个语句结构 编译的 转换为可以传递给数据库的字符串表示形式。这些类被组织成一个从最底层开始的层次结构 ClauseElement 班级。关键子类包括 ColumnElement ,它表示SQL语句中任何基于列的表达式的角色,例如在columns子句、WHERE子句和ORDER BY子句中,以及 Fr

  • 我有以下课程: 我想要两个同一类的对象,比方说: 当我把映射到时,应该保持,因为有一个。 如何使用? 我试过这样的方法: 提前谢谢

  • 我想使用SpEL来评估一些谓词。由于值/属性是动态的,我没有某个bean类。因此,我们有一个hashmap,其中(根据应用状态)键映射到不同的POJO/bean,例如: 我们希望通过设置变量来使用评估上下文,比如: 但这带来了一个例外: SpelEvaluationException:EL1007E:(位置0):在null上找不到属性或字段“person” 有人给我建议吗?

  • 鉴于 和 如何在Orika中映射以下内容? 我需要定制的映射器或过滤器吗?

  • 我和mappstruct一起工作,我有一个问题,我不知道mapstruct是否能帮上忙。问题是我有一个DATA类。 和地址 和“人” @Mapper公共接口DataToPerson { }