Java中从表中获取一行的函数
问题描述
假设“项目”是POJO。在项目的服务层中,我编写了一个从表中获取一行的函数。
@Override
public ProjectDto getAProject(Long id) {
try {
Project project = projectRepository.getOne(id);
if (project==null) {
throw new IllegalArgumentException("Project not found");
} else {
return modelMapper.map(project, ProjectDto.class);
}
} catch (EntityNotFoundException ex) {
throw new IllegalArgumentException("Project not found");
}
}
该函数可以使用已经存在的id值正常工作。但是,如果我给出不存在的值,则会发生如下异常。看起来像“ getOne()”函数不会抛出“ EntityNotFoundException”。
ModelMapper mapping errors: Error mapping com.issuemanagement.entity.Project to com.issuemanagement.dto.ProjectDto
这意味着异常来自模型映射器逻辑。由于“项目”对象填充了空值,因此无法映射到DTO类。我修改了以下功能以解决此问题。
@Override
public ProjectDto getAProject(Long id) {
boolean isExist = projectRepository.existsById(id);
if (isExist) {
Project project = projectRepository.getOne(id);
return modelMapper.map(project, ProjectDto.class);
} else {
throw new IllegalArgumentException("Project not found");
}
}
但是以这种方式,程序两次进入DB。我不喜欢仅用一次交易如何执行此操作?
BTW,如果我尝试运行“项目”的“ toString()”函数,则会抛出“ EntityNotFoundException”,但看起来不是官方方式。还是它?我希望某个地方应该有一个布尔变量。
解决方法:
getOne()
上的[JpaRepository
会在幕后调用getReference()
上的getReference()
,这将返回一个状态是延迟获取的实例。EntityManager
不会立即抛出,而只会在访问其状态时抛出在第一时间 。
通常在以下情况下使用:当您需要为实体配置EntityNotFoundException
关系时(假设为雇员配置部门),而您仅具有相关实体的ID(例如DepartmentId)。使用@ManyToOne
允许您获取Department代理实例,这样,您实际上不需要查询数据库即可获取实际的Department实例,而只是为雇员建立关系即可。
在您的情况下,您应该使用getOne()
,如果该实例不存在,它将返回一个空的findById()
:
Optional
Java中从表中获取一行的函数全部内容小编都一一给大家分享出来了, 不知道小伙伴们对此是不是有了比较深刻的认识。如果你想了解更多关于Java编程的内容,可以来爱站技术频道网站翻阅查看。