Как объединить два критерия запроса - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть запрос, который я хочу сделать Criteria Query

select u.email, st.total_amount, st.company_total  from users u
join (select user_id, SUM(balance) as total_amount,SUM(company_count) as company_total from subscription s
      where s.is_active = 0
group by user_id) st on u.id = st.user_id 
where u.is_active = 0
order by st.company_total 

Я уже сделал 1 критерий запроса

CriteriaQuery<UserImpl> innerQuery = builder.createQuery(UserImpl.class);
            Root<Subscription> subscriptionRoot = innerQuery.from(Subscription.class);
            innerQuery.multiselect(subscriptionRoot.get("user").get("id"), builder.sum(subscriptionRoot.get("balance")),
                    builder.sum(subscriptionRoot.get("companyCount")));

Я не знаю, как сделать внешний запрос весной спящий JPA. Может ли помочь.

1 Ответ

0 голосов
/ 12 февраля 2020

Определить предложение 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();

Ссылка: здесь

...