Java中从表中获取一行的函数

来源:爱站网时间:2022-10-06编辑:网友分享
今天小编就来给大家说说看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编程的内容,可以来爱站技术频道网站翻阅查看。

上一篇:安全删除文件夹的解决方法

下一篇:AlarmManager怎么取消所有先前设置的警报

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载