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个选择?