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
Vous devez vous connecter pour publier un commentaire.
À l'aide de sous-requêtes dans la clause de jointure n'est pas autorisé. en JPQL, les sous-requêtes ne sont autorisés que dans le where et HAVING partie. La méthode join signatures dans Querydsl JPA requêtes sont trop larges.
Que cette requête a besoin de deux niveaux de regroupement, peut-être qu'il ne peut pas être exprimé JPQL /Querydsl JPA.
Je te suggère d'écrire cette requête à l'aide de la Querydsl APP Native prise en charge des requêtes.
Comme Querydsl JPA utilise JPQL en interne, il est limité par l'expressivité de JPQL.
Si, à la réflexion: Comment puis-je accéder que alias comte (le) de la colonne?
Pour l'alias de colonne count utiliser un Chemin d'accès de l'instance à la place (Chemin alias, sous-requête.comme(alias), et ensuite utiliser un alias par la suite)
on dirait que son possible pour le faire maintenant stackoverflow.com/a/15022136/2037762
OriginalL'auteur Timo Westkämper