【发布时间】:2021-06-15 06:31:54
【问题描述】:
我是 Spring 的新手,虽然我可以将域实体转换为 List<Entity>,但我无法将它们正确转换为 Optional<Entity>。我在存储库和服务中有以下方法:
EmployeeRepository:
@Query(value = "SELECT ...")
Optional<Employee> findByUuid(@Param(value = "uuid") final UUID uuid);
员工服务:
@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. Spring JPA 是否收集SELECT 子句中的字段,并在服务方法中通过匹配它们的名称将它们映射到对应的DTO?如果是这样,它是否保持命名,例如数据库表和域模型类中的employee_name 到employeeName?
【问题讨论】:
-
如果
EmployeeDTO的构造函数接受Employee作为参数来构建自己,就像您的代码似乎暗示的那样,仅此而已。map在那里返回一个Optional<EmployeeDTO>。 -
@FedericoklezCulloca 是的,它接受,但上面的代码抛出不兼容的返回类型。必填:
Optional <EmployeeDTO>--> 提供:Stream <Object> -
在
.map之前去掉.stream(),我没看到。你想要Optional的map,而不是Stream的map -
@FedericoklezCulloca 是的,完全正确。我的第二个问题呢?
-
自从Spring Data already supports projections,你试过
Optional<EmployeeDTO> findByUuid(...)吗?
标签: java spring spring-data-jpa optional