【问题标题】:JPQL to select entity based on grandchild attributeJPQL 根据孙属性选择实体
【发布时间】: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

查询的结构应该如何?

【问题讨论】:

    标签: java jpql


    【解决方案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()
      猜你喜欢
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多