JPQL / QueryDSL: unir subconsulta y obtener un alias de columna

Estoy tratando de obtener un promedio para un conteo en un grupo Por unirme con una subconsulta. No sé si esa es la forma correcta de hacerlo, pero no pude hacer nada con subconsultas que no sean el documento mysema.

Scenario: ¿Cuántos pedidos por producto hizo un cliente en promedio? Significado: Un cliente ordena productos. Entonces, un cliente ordenó un producto específico varias veces (recuento). ¿Cuál es el número promedio de pedidos que el cliente realizó para cualquier producto?

Puede parecer un poco hipotético, de hecho es solo parte de un prototipo, pero me hizo preguntarme cómo obtener una referencia a una columna personalizada creada dentro de una subconsulta con el elegante QueryDSL de Mysema.

En SQL solo le da un alias a la columna de conteo y se une usando una segunda columna de ID. QueryDSL también tiene el método "as ()", pero no tengo idea, cómo recuperar esa columna y no veo cómo puede unir una consulta con otra, ya que query.list () solo obtiene una lista, pero para algunos razón por la cual la unión lo acepta. Se siente mal ...

Aquí está mi código:

    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());

Again: ¿Cómo me uno a una subconsulta? ¿Cómo obtengo la columna de "recuento" con alias para hacer más agregación como avg (es mi grupo correcto por cierto?) Podría ser que tengo algunos otros errores en esto, ¡así que cualquier ayuda es apreciada!

¡Gracias

Editar Ese es el tipo de SQL nativo que me gustaría ver que produzca 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;

Respuestas a la pregunta(1)

Su respuesta a la pregunta