JPQL / QueryDSL: присоединиться к подзапросу и получить псевдоним столбца

Я пытаюсь получить среднее значение для подсчета groupBy, присоединившись к подзапросу. Не знаю, правильно ли это, но я ничего не мог сказать о подзапросах, кроме документа mysema.

сценарий: Сколько заказов на продукт в среднем делал клиент? Значение: клиент заказывает продукты. Таким образом, клиент заказал определенный продукт несколько раз (количество). Каково среднее количество заказов, которые клиент разместил для любого продукта?

Might звучит немного гипотетично, на самом деле это просто часть прототипа, но это заставило меня задуматься, как получить ссылку на пользовательский столбец, созданный в подзапросе с fancy QueryDSL от Mysema.

в SQL вы просто даете столбцу count псевдоним и присоединяетесь, используя второй столбец ID. QueryDSL также имеет метод " as ()", но я понятия не имею, как получить этот столбец, плюс я не вижу, как он может присоединиться к одному запросу с другими, так как запрос.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 (моя группа права кстати?) Может быть, что у меня есть некоторые другие ошибки в этом, поэтому любая помощь приветствуется!

спасибо!

Edit: Это своего рода родной SQL, который я хотел бы видеть 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;

1 ответов


использование подзапросов в предложении Join не допускается. в JPQL подзапросы разрешены только в части WHERE и HAVING. Сигнатуры метода join в запросах Querydsl JPA слишком широки.

поскольку этот запрос требует двух уровней группировки, возможно, он не может быть выражен с помощью JPQL / Querydsl JPA.

Я бы предложил написать этот запрос, используя поддержку собственных запросов Querydsl JPA.

поскольку Querydsl JPA использует JPQL внутренне, он ограничен выразительностью из на JPQL.