You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Find by unique properties:排除含指定client_id的doctor_id关联记录实现

实现方案

1 定义实体类与Repository

首先创建对应关系表的JPA实体,示例如下:

@Entity
@Table(name = "doctor_client_rel")
public class DoctorClientRel {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "Doctor_ID")
    private Long doctorId;
    @Column(name = "Client_ID")
    private Long clientId;
    // 省略getter、setter、无参/全参构造方法
}

定义对应Repository接口继承JpaRepository:

public interface DoctorClientRelRepository extends JpaRepository<DoctorClientRel, Long> {
}

2 基于Spring Data属性查询的实现逻辑

该需求需要拆分两步实现,Spring Data的属性衍生查询可以直接支持这两步的逻辑:

  • 第一步:查询所有曾经关联过Client_ID=3的Doctor_ID集合,作为要排除的名单
  • 第二步:查询Doctor_ID不在排除名单内的所有关联记录

补充Repository查询方法

public interface DoctorClientRelRepository extends JpaRepository<DoctorClientRel, Long> {
    // 查询所有关联过指定clientId的医生ID,distinct去重
    List<Long> findDistinctDoctorIdByClientIdEquals(Long clientId);
    // 查询所有医生ID不在指定排除集合内的关联记录
    List<DoctorClientRel> findByDoctorIdNotIn(Collection<Long> excludedDoctorIds);
}

业务层调用示例

@Service
public class DoctorClientService {
    @Resource
    private DoctorClientRelRepository relRepository;

    public List<DoctorClientRel> getFilteredRecords() {
        // 拿到需要排除的医生ID列表:所有关联过Client_ID=3的医生
        List<Long> excludedDoctorIds = relRepository.findDistinctDoctorIdByClientIdEquals(3L);
        // 查询不在排除列表内的医生的所有关联记录
        return relRepository.findByDoctorIdNotIn(excludedDoctorIds);
    }
}

3 结果验证

针对你给出的示例数据:

  • 第一步查询得到的排除医生ID列表为[2,4]
  • 第二步查询返回医生ID不在[2,4]内的记录,仅返回Doctor_ID=3、Client_ID=5的结果,完全符合需求。

可选优化:单查询实现

如果数据量较大不想两次查询数据库,可以直接自定义JPQL查询,同样可以在Repository中定义:

@Query("SELECT r FROM DoctorClientRel r WHERE r.doctorId NOT IN (SELECT DISTINCT r2.doctorId FROM DoctorClientRel r2 WHERE r2.clientId = 3)")
List<DoctorClientRel> findAllFilteredRecords();

直接调用该方法即可一次拿到符合要求的结果,逻辑和两步写法完全一致。

内容的提问来源于stack exchange,提问作者Tiago Vieira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 20:21:02