我有两个不同的实体类,如下:
@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库来实现这一点。为了做到这一点,你必须在EntityA
和EntityB
类中声明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语句来选择一个列或不选择一个列。
:
- 加载所有列及其值
- 使用if语句循环。
- 在这个循环中,你还可以集成一个字符串列表,它是不允许的或允许的列名。
如果目的纯粹是为了存储数据,我觉得最好编写原生SQL而不进行转换。
ObjectMapper objectMapper = new ObjectMapper();
ObjectTwo objectTwo = objectMapper.readValue(objectMapper.writer().writeValueAsString(objectOne), ObjectTwo.class);