JPQL / QueryDSL: joignez-vous à la sous-requête et d'obtenir un alias de colonne

Je vais essayer d'obtenir une moyenne pour un compte sur un groupBy en se joignant à une sous-requête. Ne sais pas si ce la bonne façon de faire, mais je ne pouvais pas quelque chose au sujet des sous-requêtes autres que le mysema doc.

Scénario:
Combien de commandes par produit a un client ne s'en moyenne?
Sens: Un Client commande des produits. Si un client a commandé un produit spécifique, un certain nombre de fois (le comte). Quelle est la moyenne du nombre de commandes que le client placé pour n'importe quel produit?

Peut sembler un peu hypothétique, en fait c'est juste une partie d'un prototype, mais il m'a fait me demander, comment faire pour obtenir une référence à une colonne personnalisée créée au sein d'une sous-requête avec la fantaisie QueryDSL de Mysema.

Dans SQL que vous venez de donner à la colonne count un alias et de se joindre à l'aide d'un deuxième colonne ID. QueryDSL a les "()" méthode, mais je n'ai aucune Idée, comment récupérer cette colonne en plus je ne vois pas comment il peut se joindre à une requête avec d'autres, depuis requête.liste() permet d'obtenir une liste mais pour une raison quelconque, le joindre à l'accepte. Se sent mal...

Voici mon code:

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

Encore: Comment puis-je joindre avec une sous-requête?
Comment puis-je obtenir un alias de "comte" de la colonne de ne plus l'agrégation comme avg (c'est mon groupe de droit btw?)
Peut-être que j'ai quelques autres erreurs dans le présent, de sorte que toute aide appréciée!

Merci!

Edit:
C'est le genre de SQL natif j'aimerais voir QueryDSL produire:

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;

OriginalL'auteur Pete | 2011-08-04