如何将带有子查询的JPQL转换为Criteria API等价物?

时间:2012-06-04 02:08:04

标签: api jpa subquery criteria

拥有一个由5个实体组成的简单对象模型:

  1. 公司
  2. 组织
  3. 地址
  4. Club
  5. Shows Company, Club, and Group are all associated to Organization enter image description here

    公司与单个组织相关联。 (组和俱乐部也与单一组织相关联 - 这些是单向的,这意味着组织不包含对其所有者的引用)。组织可能有0个或更多地址。

    子查询可用于根据特定邮政编码访问公司对象,该邮政编码是地址的属性。 这是一个JPQL查询,可以访问具有特定邮政编码的公司。

      

    @Query(“从公司p中选择p,组织组织在哪里   (p.organization = org.id)并且存在(从地址广告中选择1,其中   zipcode =:zipcode和ad.organization = org.id)“)

    如何使用JPA Criteria API完成同样的事情?

1 个答案:

答案 0 :(得分:0)

这将选择使用内部联接提供邮政编码的公司,这是您想要的吗?

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Company> cq = cb.createQuery(Company.class);
Root<Organization> root = cq.from(Organization.class);
Join<Organization, Address> adr = root.join("addresses");
cq.select(root.get("company"));
cq.where(cb.equal(adr.get("zipcode"), zipcode));

如果公司没有财产,您将无法通过组织访问公司。如果您的公司有对组织的引用,那么您可以将单向映射到双向映射,将以下代码添加到组织类:

@OneToOne(mappedBy="organization") //Providing the name of property in Company 
private Company company;