Spring JPA如何通过查询方法判断实体中的List是否为空(size=0)
嘿,我来帮你搞定这个问题!当你的JPA实体里包含List类型的关联属性,想要通过**查询方法(Query Method)**筛选出那些List为空(大小等于0)的实体,其实有几种简单又靠谱的方案,我给你详细说清楚:
1. 直接用IsEmpty关键字(最推荐)
这是Spring Data JPA提供的最直观的方式,直接在查询方法名称里用IsEmpty关键字来判断集合是否为空。
举个例子:假设你有一个Book实体,关联了List<Chapter>类型的chapters属性,对应的Repository可以这么写:
public interface BookRepository extends JpaRepository<Book, Long> { // 查询所有没有章节的书籍 List<Book> findByChaptersIsEmpty(); }
Spring Data JPA会自动把这个方法转换成对应的JPQL查询,本质上等价于SELECT b FROM Book b WHERE b.chapters IS EMPTY,在数据库层面直接判断集合是否为空,效率很高,还不会触发懒加载(如果你的List是懒加载的话)。
2. 用SizeEquals指定大小为0
如果你更习惯通过集合大小来判断,也可以用SizeEquals关键字,指定大小为0:
public interface BookRepository extends JpaRepository<Book, Long> { // 查询章节数量为0的书籍 List<Book> findByChaptersSizeEquals(int size); }
调用的时候传入0就行,比如bookRepository.findByChaptersSizeEquals(0)。不过相比第一种,这种写法没那么直观,毕竟我们的需求是判断“为空”,而不是“大小等于0”,所以更推荐第一种。
3. 自定义JPQL查询(适合复杂场景)
如果你的查询需要结合其他条件,或者想更明确地控制查询语句,可以用@Query注解自定义JPQL:
public interface BookRepository extends JpaRepository<Book, Long> { @Query("SELECT b FROM Book b WHERE SIZE(b.chapters) = 0") List<Book> findBooksWithNoChapters(); // 或者用IS EMPTY写法,效果完全一样 @Query("SELECT b FROM Book b WHERE b.chapters IS EMPTY") List<Book> findBooksWithEmptyChapters(); }
这两种JPQL写法都能实现需求,SIZE(b.chapters) = 0是检查集合的大小,b.chapters IS EMPTY是直接判断集合是否为空,在底层执行的SQL是一致的,选哪种都可以。
注意事项
- 不管用哪种方法,Spring Data JPA都会在数据库层面完成判断,不会触发实体中List属性的懒加载,所以不用担心额外的查询性能问题。
- 确保你的实体关联关系配置正确(比如
@OneToMany、@ManyToMany等),否则查询可能会不符合预期。
内容的提问来源于stack exchange,提问作者Matthew Struensee

