在 Java 中将一个实体转换为另一个实体

问题描述 投票:0回答:4

我有 2 个不同的实体类如下:

@Table(name = "tableA")
public class EntityA{

    @PartitionKey
    @Column(name = "age")
    int age;

    @PartitionKey
    @Column(name = "class")
    int class;

    @Column(name = "rollNo")
    int rollNo;

}

@Table(name = "tableB")
public class EntityA{

    @PartitionKey
    @Column(name = "class")
    int class;

    @Column(name = "rollNo")
    int rollNo;

    // one column less 
}

现在基于某些条件,我需要将数据保存在两个表中。

在我的服务层中,我有一个 EntityA ::

List<EntityA>
列表,我将其传递给 DAOImpl 方法,我在其中插入数据,如下所示:

public void insertListItems(List<EntityA> entityAList) {
    // here I need to convert the List<EntityA>  to List<EntityB>
    // before table insert operation.
}

我如何在 EnitityB 少一列的地方进行转换。我不想为转换编写样板代码,因为我的实体类实际上很大。而是使用一些有助于映射的库。

java objectmapper
4个回答
1
投票

您可以使用 Jackson 的 ObjectMapper 库来实现这一点。为了使其工作,您必须在

getters
EntityA
类中声明
EntityB
,以及
default (empty)
构造函数。

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
 * Function converts list of objects to another list of objects
 * which' type is specified by the clazz attribute. Clazz attribute
 * must not be null, or it will throw a NullPointerException.
 * 
 * @param list List of target objects
 * @param clazz Class to map list objects to
 * @param <T> Target class
 * @param <F> From class
 * @return F.class List converted to T.class List
 */
public static <T, F> List<T> convertList(List<F> list, Class<T> clazz) {
    Objects.requireNonNull(clazz);
    ObjectMapper mapper = new ObjectMapper();

    // Important: this must be declared so mapper doesn't throw 
    // an exception for all properties which it can't map.
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    return Optional.ofNullable(list)
            .orElse(Collections.emptyList())
            .stream()
            .map(obj -> mapper.convertValue(obj, clazz))
            .collect(Collectors.toList());
}
public void insertListItems(List<EntityA> entityAList) {
    List<EntityB> entityBList = convertList(entityAList, EntityB.class);
    // Continue with table insert operation
}

0
投票

你可以尝试得到这样的地图

Map<String, List<String> columns;

第一个值(键)是列名,第二个值(值)是该列所有值的列表。

然后你可以只使用 if 语句来选择列。

所以:

  1. 加载所有列及其值
  2. 使用带 if 语句的循环。
  3. 在此循环中,您还可以集成一个字符串列表,这些字符串是不允许或允许的列名称。

0
投票

如果纯粹是为了存数据,我觉得还是写native SQL不转换比较好


0
投票
ObjectMapper objectMapper = new ObjectMapper();

ObjectTwo objectTwo = objectMapper.readValue(objectMapper.writer().writeValueAsString(objectOne), ObjectTwo.class);
© www.soinside.com 2019 - 2024. All rights reserved.