JPQL 根据孙属性选择实体

Posted

技术标签:

【中文标题】JPQL 根据孙属性选择实体【英文标题】:JPQL to select entity based on grandchild attribute 【发布时间】:2016-10-12 13:15:06 【问题描述】:

我正在尝试选择一个实体A,它的B 包含C 列表,其中C.d 的值必须与参数匹配。

我的实体如下所示:

@Entity
class A 

    @GeneratedValue
    @Id
    private Long id;

    @Column(name="B")
    @OneToOne(cascade=CascadeType.ALL)
    @MapsId
    private B b1;


@Entity
class B 

    @GeneratedValue
    @Id
    private Long id;

    @OneToMany(mappedBy="b2", cascade=CascadeType.ALL)
    private List<C> cs;


@Entity
class C 

    @GeneratedValue
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name="B")
    private B b2;

    private String d;

我选择实体的天真方法如下所示:

SELECT entity FROM A entity WHERE entity.b1.cs.d = :d

查询的结构应该如何?

【问题讨论】:

【参考方案1】:

应该是:

SELECT entity FROM A entity INNER JOIN entity.b1.cs CSList WHERE CSList.d = :d

阅读 JPA 中的 INNER JOIN。

http://www.thejavageek.com/2014/03/24/jpa-inner-joins/

【讨论】:

【参考方案2】:

试试这个

    TypedQuery<A> query = em.createQuery("select b.a from B b inner join C c where c.d = :d",A.class);
List<A> a = query.getResultList();

【讨论】:

您能否更详细地解释一下这是如何工作的?它似乎返回 List 而不是 A? 是的,这将返回 A 类型的对象列表,如果您确定您的结果将只有一个对象,您可以使用 getSingleResult() 而不是 getResultList()

以上是关于JPQL 根据孙属性选择实体的主要内容,如果未能解决你的问题,请参考以下文章

JPQL如何总结孩子的给定属性并获取这些孩子避免n + 1个选择?

JPQL 多对多 Dto 选择失败

Spring Boot Jpa JPQL 选择除特定列之外的列

JPQL 查询在测试中工作,而不是在生产中

JPQL 中的 LEFT JOIN ON()

JPQL 选择内部选择