Как использовать JPA Criteria API в JOIN - PullRequest
15 голосов
/ 24 января 2012
  • У меня есть пять таблиц: Компания, Продукт / Услуга, Адрес, Страна и Город.
  • Компания может иметь n продуктов с категорией, 1 адрес с 1 страной и 1 город внутри адреса объекта.
  • Пользователь выбрал "Англия - Лидс".
  • Теперь я знаю, что мне нужно выбрать все компании из ДБ, где город. Лидс и заполнить список продуктов / услуг этими компаниями продукты или услуги. После этого пользователь может выбрать, например, стоматолога из третьего списка.
  • После этого я знаю Enlgand - Leeds - Dentist и я должен заселяться последний список с компани (стоматологи в Лидсе)

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 Ответ

21 голосов
/ 24 января 2012

используйте join (),

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

См., http://en.wikibooks.org/wiki/Java_Persistence/Querying#Joining.2C_querying_on_a_OneToMany_relationship

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...