2011-08-04 27 views
9

Bir alt sorguya katılarak bir groupBy'de bir sayı elde etmeye çalışıyorum. Bu doğru gitmek için doğru yol olup olmadığını bilmiyorum ama mysema doc dışında alt sorgular hakkında bir şey olamazdı.JPQL/QueryDSL: alt sorguya katıl ve diğer sütun al

Senaryo: Ürün başına ortalama kaç sipariş verildi? Anlamı: Bir müşteri ürünleri sipariş eder. Böylece bir müşteri belirli bir ürünü birkaç kez sipariş etti (sayım). Müşterinin herhangi bir ürün için yerleştirdiği ortalama sipariş sayısı nedir?

Biraz varsayımsal bir ses, aslında bir prototipin parçası, ama merak ettim, Mysema'dan fantezi bir QueryDSL ile bir alt sorguda oluşturulan özel bir sütuna nasıl başvurulur.

SQL'de, sayma sütunu bir takma ad verin ve ikinci bir kimlik sütunu kullanarak katılın. QueryDSL de "as()" yöntemine sahip, ancak hiçbir fikrim yok, bu sütunu nasıl alacağımı ve anonim bir sorguya nasıl katılacağını görmüyorum, çünkü query.list() sadece bir liste alıyor ancak bazı katılma sebebi kabul eder. İşte ... yanlış

geliyor kodum var: Yine

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

: Nasıl bir alt sorgu ile katılırım? Takma ad ("count") sütununu avg gibi daha fazla toplama yapmak için nasıl alabilirim (benim grubum doğru btw?) Bu konuda başka bazı hatalarm olabilir.

Teşekkürler!

Düzenleme: Ben QueryDSL üretmek görmek istiyorum yerli SQL tür :

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; 

cevap

11

maddesini katılmak içinde alt sorgular kullanma izin verilmez. JPQL'de, alt sorgulara yalnızca WHERE ve HAVING kısmında izin verilir. Querydsl JPA sorgularındaki birleştirme yöntemi imzaları çok geniş.

Bu sorguda iki düzey gruplamaya ihtiyaç duyulduğundan, JPQL/Querydsl JPA ile ifade edilemez.

Bu sorguyu Querydsl JPA Yerel sorgu desteğini kullanarak yazmanızı öneririm.

Querydsl JPA, JPQL'yi dahili olarak kullanır, JPQL'nin ifadesiyle kısıtlanır.

+0

Teşekkürler! Çok kötü olsa da, QueryDSL ve herhangi bir teorik sınırlama aracına dayanan genel bir arama yapmayı düşündüğümden, arama tekniklerime nasıl alternatif teknikler ekleyeceğimi düşünmeliyim ... – Pete

+0

İkinci düşünceye rağmen: Nasıl erişebilirim? diğer ad() sütunu mu? – Pete

+0

Diğer ad için sütun yerine bir Yol örneği kullanın (Yol takma adları, subQuery.as (diğer ad) ve sonra diğer ad kullanın) –

İlgili konular