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
相关产品推荐
相关产品推荐

