JPA Fetch查询含IS NOT NULL不生效问题求助
问题分析
你当前的查询返回所有Abc记录,核心原因有两点:
- EAGER加载的干扰:Abc的
xyzList配置为FetchType.EAGER,Hibernate会自动加载所有关联的Xyz数据,直接掩盖了查询的过滤效果。 - 查询逻辑的局限性:虽然用了
join fetch,但该查询仅保证返回的Abc至少关联一个符合条件的Xyz;如果Abc存在多个Xyz,返回的xyzList仍会包含所有关联项,若实际数据中所有Abc都有至少一个有效Xyz,也会出现返回全量的情况。
解决方案
根据你“列出所有关联了latestId不为空的Xyz的Abc”的需求,分两种场景提供方案:
场景1:仅筛选符合条件的Abc(不限制返回的xyzList内容)
使用exists子查询精准筛选,避免笛卡尔积,同时不受EAGER加载的影响:
@Repository public interface AbcRepository extends PagingAndSortingRepository<Abc, String> { @Query("select j from Abc j where exists (select s from j.xyzList s where s.latestId is not null)") List<Abc> findAllWithValidXyz(Sort sort); }
场景2:筛选符合条件的Abc,且返回的xyzList仅包含latestId不为空的Xyz
需要先调整关联加载策略为LAZY,再结合distinct和join fetch实现:
步骤1:修改Abc实体的关联配置
public class Abc { @OneToMany(orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "abc") private List<Xyz> xyzList; }
步骤2:更新Repository查询
@Repository public interface AbcRepository extends PagingAndSortingRepository<Abc, String> { @Query("select distinct j from Abc j join fetch j.xyzList s where s.latestId IS NOT NULL") List<Abc> findAllWithValidXyz(Sort sort); }
添加distinct是为了避免因一个Abc关联多个有效Xyz而产生重复实例,Hibernate会自动合并重复结果。
内容的提问来源于stack exchange,提问作者Ashish Pancholi
相关产品推荐
相关产品推荐

