如何在JOIN中使用JPA Criteria API

时间:2012-01-24 01:04:46

标签: jpa join

  • 我有五个表:公司,产品/服务,地址,国家和地区 市。
  • 公司可以拥有n个产品类别,1个地址和1个国家/地区 和地址实体内的1个城市。
  • 用户选择了“英格兰 - 利兹”。
  • 我现在知道我必须选择db所在城市的所有公司 是利兹并与这些公司一起填充产品/服务清单 产品或服务。之后,用户可以选择例如牙医 来自第三个清单。
  • 之后我知道Enlgand - 利兹 - 牙医,我必须填充 有补偿的最后一个清单(利兹的牙医)

public class Company implements java.io.Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Short companyId;
@OneToOne(cascade=CascadeType.PERSIST)
private Address address;
private String companyName;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "company",cascade=CascadeType.PERSIST)
private Set<Product> products = new HashSet<Product>(0);

public class Product implements java.io.Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "productId", unique = true, nullable = false)
private Integer productId;
private Short branchId;
private String productName;
private String sku;
private String category; ------> I am using this field in company search (dentists, garages etc.)

我如何只查询那些拥有牙科类别产品的公司?

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

CriteriaQuery<Company> criteria = criteriaBuilder.createQuery( Company.class );
Root<Company> companyRoot = criteria.from( Company.class );
//criteria.select(companyRoot);

TypedQuery<Company> q = em.createQuery(criteria);
List<Company> results = q.getResultList();

现在我有了每家公司,我怎样才能选择具有正确类别的公司?我想我需要JOIN,但我不知道如何使用它。

1 个答案:

答案 0 :(得分:21)

使用join(),

criteriaBuilder.equal(companyRoot.join("products").get("category"), "dentist")

请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Querying#Joining.2C_querying_on_a_OneToMany_relationship