Я пытаюсь получить среднее значение для подсчета groupBy, присоединяясь к подзапросу. Не знаю, подходит ли это вообще, но я ничего не мог сказать о подзапросах, кроме mysema doc.
Сценарий:
Сколько заказов в среднем за продукт делал клиент?
Значение: Клиент заказывает продукцию. Таким образом, клиент заказывал определенный продукт несколько раз (считайте). Каково среднее количество заказов, которые заказчик сделал на любой товар?
Может показаться немного гипотетическим, на самом деле это всего лишь часть прототипа, но меня удивило, как получить ссылку на пользовательский столбец, созданный в подзапросе с причудливым QueryDSL от Mysema.
В SQL вы просто присваиваете столбцу count псевдоним и присоединяетесь, используя второй столбец ID. В QueryDSL также есть метод as (), но я понятия не имею, как извлечь этот столбец, плюс я не понимаю, как он может соединить один запрос с другим, поскольку query.list () просто получает список, но для некоторых причина, по которой соединение принимает это. Чувствует себя неправильно ...
Вот мой код:
JPQLQuery query = createJPQLQuery();
QOrdering qOrdering = QOrdering.ordering;
QProduct qProduct = QProduct.product;
QCustomer qCustomer = QCustomer.customer;
// how many of each product did a customer order?
HibernateSubQuery subQuery = new HibernateSubQuery();
subQuery.from(qOrdering).innerJoin(qOrdering.product,qProduct).innerJoin(qOrdering.customer, qCustomer);
subQuery.groupBy(qCustomer,qProduct).list(qCustomer.id,qProduct.id,qProduct.count());
// get the average number of orders per product for each customer
query.from(qCustomer);
query.innerJoin(subQuery.list(qCustomer.id,qOrdering.count().as("count_orders")));
query.groupBy(qCustomer.id);
return (List<Object[]>) query.list(qCustomer.firstname,subQuery.count_orders.avg());
Опять же: Как мне присоединиться к подзапросу?
Как мне получить столбец с псевдонимом "count" для агрегирования, например avg (кстати, моя группа права?)
Возможно, у меня есть некоторые другие ошибки в этом, поэтому любая помощь приветствуется!
Спасибо!
Edit:
Это родной SQL, который я хотел бы увидеть в QueryDSL:
Select avg(numOrders) as average, cust.lastname from
customer cust
inner join
(select count(o.product_id) as numOrders, c.id as cid, p.name
from ordering o
inner join product p on o.product_id=p.id
inner join customer c on o.customer_id=c.id
group by o.customer_id, o.product_id) as numprods
on cust.id = numprods.cid
group by numprods.cid
order by cust.lastname;