首页 > 解决方案 > QueryDSL 异常:查询指定连接提取,但提取关联的所有者不存在于选择列表中

问题描述

我很难理解为什么会遇到 QueryException query specified join fetching, but the owner of the fetched association was not present in the select list

在我的项目中,我需要执行以下操作:

projectRequest.getName();
...... a bunch of different projectRequest gets...

projectRequest.getProject().getName()
...... a bunch of project gets....

projectRequest.getProject().getProjectStatus().getName();

这是实体的样子:

public class ProjectRequest {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ProjectId", referencedColumnName = "ProjectId", insertable = false, updatable = false)
    private Project project;
}

public class Project {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "StatusId", insertable = false, updatable = false)
    private ProjectStatus projectStatus;
}

所以我需要获取一堆 ProjectRequests 及其关联的项目,并且还需要访问项目的状态。这将我引向 N+1 问题。我正在阅读一个解决方案是获取加入延迟获取的资源,所以这就是我所做的:

select projectRequest
from com.api.integration.entities.ProjectRequest projectRequest
  left join fetch projectRequest.project as project
  left join fetch projectRequest.project.projectStatus as projectStatus

但是在添加left join fetch projectRequest.project.projectStatus as projectStatus部分后,我遇到了 query specified join fetching, but the owner of the fetched association was not present in the select list. 我该如何解决这个问题?为什么会这样?

这是我在 api 中的查询:

new JPAQuery<ProjectRequest>()
    .from(projectRequest)
    .leftJoin(projectRequest.project, project).fetchJoin()
    .leftJoin(projectRequest.project.projectStatus, projectStatus).fetchJoin();

标签: javaspring-data-jpaquerydsl

解决方案


推荐阅读