Estoy tratando de obtener un promedio para un conteo de un groupBy al unirme a una subconsulta. No sé si ese es el camino correcto, pero no pude hacer nada sobre subconsultas que no sean el documento de mysema.JPQL/QueryDSL: join subquery y obtener una columna con alias
Escenario: ¿Cuántas órdenes por producto hizo un cliente en promedio? Significado: Un cliente ordena productos. Entonces, un cliente pidió un producto específico varias veces (recuento). ¿Cuál es la cantidad promedio de pedidos que el cliente realizó para un producto?
Puede sonar 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 simplemente le da un alias a la columna de recuento 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 se puede unir una consulta con anothers, ya que query.list() solo obtiene una lista, pero para algunos razón por la que 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());
Una vez más: ¿Cómo me uno con una subconsulta? ¿Cómo obtengo la columna de "recuento" con alias para hacer más agregación como avg (es mi grupo cierto por cierto?) Podría ser que tengo algunos otros errores en esto, por lo que cualquier ayuda apreciada!
Gracias!
Editar: Ese es el tipo de SQL nativo Me gustaría ver QueryDSL productos:
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;
Gracias! Aunque es una lástima, ya que estoy pensando en construir una búsqueda genérica basada en QueryDSL y cualquier limitación teórica, tengo que pensar en cómo incluir técnicas alternativas en mi marcado de búsqueda ... – Pete
Pensándolo bien: ¿Cómo accedo? esa columna de conteo alias()? – Pete
Para la columna de recuento de alias, use una instancia de Path en su lugar (alias de ruta, subQuery.as (alias) y luego use alias) –