サブクエリに参加して、groupByのカウントの平均を取得しようとしています。それが正しい方法かどうかはわかりませんが、mysemadoc以外のサブクエリについては何もできませんでした。
シナリオ:顧客は製品ごとに平均して何件の注文をしましたか?意味:顧客が製品を注文します。そのため、顧客は特定の製品を何度も注文しました(カウント)。顧客が製品に対して行った平均注文数はいくつですか?
少し仮説的に聞こえるかもしれませんが、実際にはプロトタイプの一部にすぎませんが、Mysemaの豪華なQueryDSLを使用して、サブクエリ内に作成されたカスタム列への参照を取得する方法について疑問に思いました。
SQLでは、カウント列にエイリアスを指定し、2番目の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のような集計を行うにはどうすればよいですか(私のグループは正しいですか?)これには他のエラーがある可能性があるので、助けていただければ幸いです。
ありがとう!
編集: これは、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;