我是Spring的新手,虽然我可以将域实体转换为List<Entity>,但我不能为Optional<Entity>正确地转换它们。我在存储库和服务中有以下方法:
EmployeeRepository:
@Query(value = "SELECT ...")
Optional<Employee> findByUuid(@Param(value = "uuid") final UUID uuid);EmployeeService:
@Override
@LogExecution
@Transactional(readOnly = true)
public Optional<EmployeeDTO> findByUuid(UUID uuid) {
Optional<Employee> employee = employeeRepository.findByUuid(uuid);
return employee
.stream()
.map(EmployeeDTO::new)
// .orElse(null);
//.findFirst(); /// ???
}我的问题:
1.如何正确地将Optional<Employee>转换为Optional<EmployeeDTO>?
2.是否收集SELECT子句中的字段,并通过匹配它们的名称将服务方法中的字段映射到相应的DTO?如果是这样的话,它是否维护数据库表和域模型类中的命名(例如employee_name到employeeName )?
发布于 2021-06-15 06:46:29
employeeRepository#findByUuid的输出Optional<Employee>和方法输出类型Optional<EmployeeDTO>之间的映射是1:1,因此这里不涉及Stream (调用stream())。
您只需要正确地将Employee字段映射到EmployeeDTO中。处理Optional从employeeRepository#findByUuid返回的情况实际上是空的,可以将其留在可选的后续链上。不需要orElse或findFirst调用。
使用all-args构造函数和getter假设以下类:
class Employee {
private final long id;
private final String firstName;
private final String lastName;
}class EmployeeDTO {
private final long id;
private final String name;
private final String surname;
}..。你可以做这个。除了从Employee的字段中找到创建Employee的方法之外,什么都不需要。如果从employeeRepository返回的Optional被返回,则不会发生映射,并且返回一个空的Optional。
@Override
@LogExecution
@Transactional(readOnly = true)
public Optional<EmployeeDTO> findByUuid(UUID uuid) {
return employeeRepository
.findByUuid(uuid) // Optional<Employee>
.map(emp -> new EmployeeDTO( // Optional<EmployeeDTO>
emp.getId(), // .. id -> id
emp.getFirstName(), // .. firstName -> name
emp.getLastName())); // .. lastName -> surname
}注意:对于Employee -> EmployeeDTO映射,我建议选择其中之一:
EmployeeDTO中创建一个接受EmployeeDTO的构造函数,允许与.map(EmployeeDTO::new)映射(缺点:创建依赖项)。发布于 2021-06-15 06:49:03
有多个选项可以将实体映射到DTO。
class EmployeeDTO {
// fields here ...
public static EmployeeDTO ofEntity(Employee entity) {
var dto = new EmployeeDTO();
// set fields
return dto;
}
}并在您的服务中调用employee.map(EmployeeDTO::ofEntity)。
https://stackoverflow.com/questions/67981095
复制相似问题