JPQL / QueryDSL: присоединиться к подзапросу и получить столбец с псевдонимом

Я пытаюсь получить среднее значение по счетчику для groupBy путем присоединения с помощью подзапроса. Не знаю, верен ли это вообще, но я ничего не мог о подзапросах, кроме mysema doc.

Сценарий: Сколько в среднем заказов на товар сделал покупатель? Значение: Клиент заказывает товары. Таким образом, клиент заказывал определенный продукт несколько раз (количество). Каково среднее количество заказов, которые клиент размещает на какой-либо продукт?

Может показаться немного гипотетическим, на самом деле это всего лишь часть прототипа, но это заставило меня задуматься, как получить ссылку на настраиваемый столбец, созданный в подзапросе с причудливым QueryDSL от Mysema.

В SQL вы просто задаете столбцу счетчика псевдоним и присоединяетесь, используя второй столбец идентификатора. 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 (моя группа права, кстати?) Возможно, у меня есть другие ошибки, поэтому любая помощь приветствуется!

Спасибо!

Изменить: Я бы хотел, чтобы QueryDSL производил такой собственный SQL:

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;
11
задан Pete 5 August 2011 в 08:19
поделиться