Spring Data JPA如何查询Set类型字段包含指定元素或集合的记录
单个元素包含查询支持情况
Spring Data JPA 的 Contains 关键字完全支持 @ElementCollection 修饰的集合字段判断是否包含单个元素,你只需要调整方法参数为单个值即可:
// 筛选 daysOfTheWeek 包含指定单个星期值的记录 List<Schedule> findAllByDaysOfTheWeekContains(Long day);
包含指定集合所有元素的查询支持情况
你当前写的 findAllByDaysOfTheWeekContains(Set<Long> days) 无法实现匹配所有元素的需求:默认的 Contains 关键字传入集合参数时,只会判断集合字段是否包含参数中的任意一个元素,而非全部。
要实现包含集合所有元素的查询,推荐手写JPQL实现:
public interface IScheduleRepository extends Repository<Schedule, Long> { @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) @Query("SELECT s FROM Schedule s JOIN s.daysOfTheWeek d WHERE d IN :days GROUP BY s.id HAVING COUNT(DISTINCT d) = :#{#days.size()}") List<Schedule> findAllByDaysOfTheWeekContainsAll(@Param("days") Set<Long> days); }
上述语句的逻辑是先关联查询出所有匹配参数集合中任意元素的记录,再通过分组统计匹配到的元素数量等于参数集合的大小,即可过滤出包含所有指定元素的记录。
另外注意你实体类中 daysOfTheWeek 目前定义的是 List<Long> 类型,如果业务上需要对存储的星期值去重,可以改成 Set<Long>,不会影响上述查询逻辑的执行。
内容的提问来源于stack exchange,提问作者KJ0797
相关产品推荐
相关产品推荐

