如何通过 JPA 查询按子类实体值获取父实体?

Posted

技术标签:

【中文标题】如何通过 JPA 查询按子类实体值获取父实体?【英文标题】:How can I fetch parent entity by child class entity value by JPA query? 【发布时间】:2021-06-24 16:13:46 【问题描述】:

我正在尝试通过查询通过子实体获取主要父实体。我的实体如下所示。

主要父实体

@Entity
@Data
@EqualsAndHashCode(callSuper = true)
Public class Buyer
    
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    List<Account> accounts;
    

帐户类

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Account

Account 类在下面的类中继承

@Entity
@Data
@EqualsAndHashCode(callSuper = true)
@DiscriminatorValue("buyer1")
public class BuyerAccount1 extends Account 
    @Column(unique = true)
    private UUID buyerId;


我想通过resourceId 现有BuyerAccount1 获得Optional。我已经尝试了下面的 JPA 查询来做到这一点,但我得到了 Optional.empty() 作为响应。

@Query("SELECT pb \n" +
            " FROM Buyer pb join pb.accounts a \n" +
            " WHERE  a.buyerId= :buyerId \n" +
            " AND type(a) = BuyerAccount1")
    Optional<Buyer> findByBuyerAccount1(@Param("buyerId") UUID buyerId);

我是否在查询中遗漏了什么?

提前致谢!!

【问题讨论】:

【参考方案1】:

我建议你改用这样的查询:

@Query("SELECT pb \n" +
        " FROM Buyer pb \n" +
        " WHERE EXISTS (SELECT 1 FROM pb.accounts a WHERE a.buyerId = :buyerId)")
Optional<Buyer> findByBuyerAccount1(@Param("buyerId") UUID buyerId);

除此之外,如果你使用 mysql,你需要为 UUID 类型指定一个长度,因为它默认生成为binary(255),这将导致填充值。使用@Column(length = 16)

【讨论】:

以上是关于如何通过 JPA 查询按子类实体值获取父实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写基于作为父实体spring数据jpa的一部分的字段对结果进行排序的查询方法

JPA 一个实体中的两个惰性集合 - 如何运行 JPA 查询以获取实体和只有一个集合

如何从按距离排序的 JPA 实体中获取结果?

通过 JPA 查询

JPA:查询以根据实体类中定义的外键值获取结果?

JPA。如何子类化现有实体并保留其 ID?