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

如何在JPQL查询中按Discriminator值筛选?(Spring Boot 3)

解决方案:在JPQL中筛选指定鉴别器类型的实体

当然可以实现你的需求,有两种常用且可靠的方式,以下是具体说明:

方式一:使用JPA标准TYPE()表达式(推荐)

这种方式无需直接操作数据库列,完全基于实体类类型进行查询,符合JPA的面向对象设计理念,同时避免硬编码鉴别器值。

JPQL查询示例:

SELECT c FROM Contributor c WHERE TYPE(c) IN (ContributorDesigner, ContributorTrucker)

在Spring Data JPA Repository中定义对应方法:

@Repository
public interface ContributorRepository extends JpaRepository<Contributor, Long> {

    @Query("SELECT c FROM Contributor c WHERE TYPE(c) IN (ContributorDesigner, ContributorTrucker)")
    List<Contributor> findDesignersAndTruckers();
}

方式二:直接查询鉴别器列

如果需要基于鉴别器的具体字符串值筛选,可以直接在JPQL中引用父类定义的contributor_code列(列名需与@DiscriminatorColumn配置一致)。

JPQL查询示例:

SELECT c FROM Contributor c WHERE c.contributor_code IN (:designerCode, :truckerCode)

对应的Spring Data JPA方法实现:

@Repository
public interface ContributorRepository extends JpaRepository<Contributor, Long> {

    // 位置参数方式
    @Query("SELECT c FROM Contributor c WHERE c.contributor_code IN (?1, ?2)")
    List<Contributor> findByContributorCodes(String designerCode, String truckerCode);

    // 集合参数方式(更灵活,支持批量传入值)
    @Query("SELECT c FROM Contributor c WHERE c.contributor_code IN (:codes)")
    List<Contributor> findByContributorCodes(@Param("codes") List<String> codes);
}

关键注意事项

  • 你的父类Contributor缺少@Entity注解,JPA实体必须添加该注解才能被框架识别,否则继承关系与鉴别器配置不会生效,修正后的父类代码:
@Entity
@Table
@DiscriminatorColumn(name = "contributor_code", discriminatorType = DiscriminatorType.STRING)
public class Contributor {
    // ... 类属性与方法
}
  • 使用TYPE()表达式时,确保所有子类都正确添加了@Entity和@DiscriminatorValue注解。

内容的提问来源于stack exchange,提问作者robert trudel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:20:28