Определить предложение JOIN довольно просто. Сначала вы вызываете метод from вашего объекта CriteriaQuery, чтобы получить объект Root. На следующем шаге вы можете вызвать метод join для определения вашего предложения JOIN.
Ниже приведен пример документов, вы можете управлять им в соответствии с вашим примером.
Вы можете ссылаться на документы Hibernate для примеры соединения. Ниже приведен пример кода.
CriteriaQuery<String> q = cb.createQuery(String.class);
Root<Order> order = q.from(Order.class);
q.select(order.get("shippingAddress").<String>get("state"));
CriteriaQuery<Product> q2 = cb.createQuery(Product.class);
q2.select(q2.from(Order.class)
.join("items")
.<Item,Product>join("product"));
Документы для ссылки
Другой быстрый пример, который я нашел, приведен ниже:
<Y> ListJoin<X, Y> join(ListAttribute<? super X, Y> list);
Быстрый пример ( при условии, что у сотрудника есть список задач с отношением «многие ко многим»):
CriteriaQuery<Employee> query = criteriaBuilder.createQuery(Employee.class);
Root<Employee> employee = query.from(Employee.class);
ListJoin<Employee, Task> tasks = employee.join(Employee_.tasks);
query.select(employee)
.where(criteriaBuilder.equal(tasks.get(Task_.supervisor),
employee.get(Employee_.name)));
TypedQuery<Employee> typedQuery = entityManager.createQuery(query);
List<Employee> employees = typedQuery.getResultList();
Ссылка: здесь