如何在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
相关产品推荐
相关产品推荐

