Критерии гибернацииQuery где - поле ManyToOne - PullRequest
0 голосов
/ 24 апреля 2020

это фрагмент моего объекта / класса Employee:

@Entity
@Table
public class Employee {
   ...
   @ManyToOne(.....)
   @JoinColumn(name="department_id")
   private Department department;
}

Теперь я хочу получить всех сотрудников из указанного c отдела (сотрудников с указанным c отдела_идентификатором):

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> criteriaQuery = builder.createQuery(Employee.class);
Root<Employee> employeeRoot = criteriaQuery.from(Employee.class);

criteriaQuery.select(employeeRoot);
criteriaQuery.where(builder.equal(employeeRoot.get(????????????), id));

Там моя проблема. Как я могу получить доступ к Department.id? Я знаю, что должен получить ({конкретное c поле}), но я не знаю, как. Должен ли я как-то сначала присоединиться к этим столам? Ждем ваших ответов!

1 Ответ

1 голос
/ 25 апреля 2020

Вам необходимо создать объединение с вашей связанной таблицей. Пример:

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> criteriaQuery = builder.createQuery(Employee.class);
Root<Employee> employeeRoot = criteriaQuery.from(Employee.class);

Join<Employee, Departament> join = from.join("department", JoinType.INNER);
criteriaQuery.where(builder.equal(join.get("specific_fied"), your_specific_fied));

TypedQuery<Employee> typedQuery = session.createQuery(criteriaQuery);

List<Employee> employees = typedQuery.getResultList();
for (Employee e : employees) {
    System.out.println(e.getName());
}

session.getTransaction().commit();
session.close();
entityManagerFactory.close();

Если вы хотите что-то такое же, как этот запрос:

SELECT c, p.name FROM Country c LEFT OUTER JOIN c.capital p

, вы можете построить это:

  CriteriaQuery<Country> q = cb.createQuery(Country.class);
  Root<Country> c = q.from(Country.class);
  Join<Country> p = c.join("capital", JoinType.LEFT);
  q.multiselect(c, p.get("name"));

Если Вы можете создать что-нибудь такое же, как этот запрос:

SELECT c FROM Country c JOIN FETCH c.capital

Вы можете построить это:

  CriteriaQuery<Country> q = cb.createQuery(Country.class);
  Root<Country> c = q.from(Country.class);
  Fetch<Country,Capital> p = c.fetch("capital");
  q.select(c);

Дополнительные примеры см. в предложении FROM (JPQL / Критерии API)

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