Spring Data中按集合字段查询:判断项目是否已分配
正确编写已分配/未分配项目JPQL查询的方法
错误原因
你原来的查询写法错误在于:JPQL中不能直接对集合类型的属性(比如projectAssignedUsers这种List<UserProject>)使用= null或!= null进行判断,这会导致SQL语法错误,也就是你遇到的PostgreSQL语法错误。
正确查询写法
1. 查询已分配项目(关联了UserProject的项目)
有两种简洁的写法:
方式一:使用is not empty判断集合非空
@Query("from Project p where p.country = :country and p.projectAssignedUsers is not empty order by p.name asc") List<Project> getAssignedProjectsByCountry(String country, Pageable pageable);
方式二:使用exists子查询(适合需要额外过滤关联实体的场景)
如果之后需要对关联的UserProject或User加条件(比如只查分配给活跃用户的项目),这种方式更灵活:
@Query("from Project p where p.country = :country and exists (select up from UserProject up where up.project = p) order by p.name asc") List<Project> getAssignedProjectsByCountry(String country, Pageable pageable);
2. 查询未分配项目(没有关联UserProject的项目)
同样对应两种写法:
方式一:使用is empty判断集合为空
@Query("from Project p where p.country = :country and p.projectAssignedUsers is empty order by p.name asc") List<Project> getUnassignedProjectsByCountry(String country, Pageable pageable);
方式二:使用not exists子查询
@Query("from Project p where p.country = :country and not exists (select up from UserProject up where up.project = p) order by p.name asc") List<Project> getUnassignedProjectsByCountry(String country, Pageable pageable);
补充说明
is empty/is not empty是JPQL专门用于判断集合类型属性是否为空的语法,写法简洁,适合基础场景。exists/not exists子查询的扩展性更强,当需要对关联的UserProject或User添加额外过滤条件时(比如up.user.status = 'ACTIVE'),这种写法能直接集成进去。
内容的提问来源于stack exchange,提问作者Carlos Gonzalez
相关产品推荐
相关产品推荐

