You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot JPA中如何查询含可为空外键的关联结果?

在Spring Boot JPA中获取外键可为空的关联查询结果

你用的JOIN是内连接,只会返回两张表中关联条件完全匹配的记录,所以自然过滤掉了courseTypes表中course_id为null的记录。要拿到所有结果,得换成左外连接(LEFT JOIN),它会保留左表的全部记录,右表没有匹配的话对应字段就显示null。

下面分两种常见场景给你解决方案:

场景1:查所有courseTypes记录(含course_id为null的),并关联对应的courses数据

用JPQL查询

在Repository接口里自定义查询:

@Query("SELECT ct, c FROM CourseTypes ct LEFT JOIN Courses c ON ct.courseId = c.id")
List<Object[]> findAllCourseTypesWithCourses();

如果想直接返回实体对象,也可以在CourseTypes实体里配置关联关系,然后直接查询所有CourseTypes:

// CourseTypes实体类
@Entity
@Table(name = "courseTypes")
public class CourseTypes {
    @Id
    private Long id;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "course_id", nullable = true) // 明确外键允许为空
    private Courses course;
    
    // 其他字段、getter、setter
}

// Repository接口
List<CourseTypes> findAll();

这样调用findAll()就能拿到所有子表记录,包括course_id为null的,关联的父表数据会自动设为null。

场景2:查所有courses记录,以及对应的courseTypes数据(含没有子表关联的父表记录)

用JPQL查询

@Query("SELECT c, ct FROM Courses c LEFT JOIN c.courseTypes ct")
List<Object[]> findAllCoursesWithCourseTypes();

对应的父表实体配置:

@Entity
@Table(name = "courses")
public class Courses {
    @Id
    private Long id;
    
    @OneToMany(mappedBy = "course", fetch = FetchType.LAZY)
    private List<CourseTypes> courseTypes;
    
    // 其他字段、getter、setter
}

原生SQL的情况

如果用原生SQL,同样把JOIN改成LEFT JOIN就行:

SELECT * FROM course_types ct LEFT JOIN courses c ON ct.course_id = c.id;

内容的提问来源于stack exchange,提问作者WARUTS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:45:24