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



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

@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.
}

我如何在实体b中进行转换,我少了一列。我不想为转换编写样板代码,因为我的实体类实际上很大。相反,使用一些库来帮助映射。

您可以使用Jackson的ObjectMapper库来实现这一点。为了做到这一点,你必须在EntityAEntityB类中声明getters,以及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
}

你可以试着得到这样一个地图Map<String, List<String> columns;

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

那么你可以使用if语句来选择一个列或不选择一个列。

:

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

如果目的纯粹是为了存储数据,我觉得最好编写原生SQL而不进行转换。

ObjectMapper objectMapper = new ObjectMapper();
ObjectTwo objectTwo = objectMapper.readValue(objectMapper.writer().writeValueAsString(objectOne), ObjectTwo.class);

相关内容

  • 没有找到相关文章

最新更新