在 Java 中将一个实体转换为另一个实体
Convert One Entity to Another Entity in Java
我有 2 个不同的实体 Class,如下所示:
@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 中少一列的地方进行转换。我不想为转换编写样板代码,因为我的实体 class 实际上很大。而是使用一些有助于映射的库。
您可以尝试获取这样的地图Map<String, List<String> columns;
第一个值(键)是列名,第二个值(值)是该列所有值的列表。
那么你可以只使用 if 语句来选择或不选择列。
所以:
- 加载所有列及其值
- 使用带有 if 语句的循环。
- 在此循环中,您还可以集成一个字符串列表,这些字符串是不允许或允许的列名称。
您可以使用 Jackson 的 ObjectMapper 库来实现此目的。为了让它工作,你必须在 EntityA
和 EntityB
class 中声明 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
}
如果目的是单纯的存储数据我感觉其实不用转换,不如直接写原生sql更好.我的英语不好我使用翻译软件,希望能帮到你
If the purpose is purely to store data, I feel that it is better to write native SQL without converting. My English is not good, I use translation software, I hope it can help you
我有 2 个不同的实体 Class,如下所示:
@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 中少一列的地方进行转换。我不想为转换编写样板代码,因为我的实体 class 实际上很大。而是使用一些有助于映射的库。
您可以尝试获取这样的地图Map<String, List<String> columns;
第一个值(键)是列名,第二个值(值)是该列所有值的列表。
那么你可以只使用 if 语句来选择或不选择列。
所以:
- 加载所有列及其值
- 使用带有 if 语句的循环。
- 在此循环中,您还可以集成一个字符串列表,这些字符串是不允许或允许的列名称。
您可以使用 Jackson 的 ObjectMapper 库来实现此目的。为了让它工作,你必须在 EntityA
和 EntityB
class 中声明 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
}
如果目的是单纯的存储数据我感觉其实不用转换,不如直接写原生sql更好.我的英语不好我使用翻译软件,希望能帮到你
If the purpose is purely to store data, I feel that it is better to write native SQL without converting. My English is not good, I use translation software, I hope it can help you