2016-07-22 23 views
4

我使用queryDSL從基地獲得了一些額外的數據用戶:QueryDSL - 爲了通過數作爲別名

public List<Tuple> getUsersWithData (final SomeParam someParam) { 
    QUser user = QUser.user; 
    QRecord record = QRecord.record; 
    JPQLQuery = query = new JPAQuery(getEntityManager()); 

    NumberPath<Long> cAlias = Expressions.numberPath(Long.class, "cAlias"); 
    return query.from(user) 
     .leftJoin(record).on(record.someParam.eq(someParam)) 
     .where(user.active.eq(true)) 
     .groupBy(user) 
     .orderBy(cAlias.asc()) 
     .list(user, record.countDistinct().as(cAlias)); 
} 

儘管它是作爲理想的工作,它生成SQL兩秒():

SELECT 
    t0.ID 
    t0.NAME 
    to.ACTIVE 
    COUNT(DISTINCT (t1.ID)) 
FROM USERS t0 LEFT OUTER JOIN t1 ON (t1.SOME_PARAM_ID = ?) 
WHERE t0.ACTIVE = true 
GROUP BY t0.ID, to.NAME, t0.ACTIVE 
ORDER BY COUNT(DISTINCT (t1.ID)) 

我想知道是否有可能得到這樣的:

SELECT 
    t0.ID 
    t0.NAME 
    to.ACTIVE 
    COUNT(DISTINCT (t1.ID)) as cAlias 
FROM USERS t0 LEFT OUTER JOIN t1 ON (t1.SOME_PARAM_ID = ?) 
WHERE t0.ACTIVE = true 
GROUP BY t0.ID, to.NAME, t0.ACTIVE 
ORDER BY cAlias 

我不明白這個從documen如果可能的話,請給我一些指導。

回答

0

這是SQL強加的限制,而不是queryDSL限制。 您可以嘗試在數據庫控制檯中運行您的建議查詢 - 我認爲它不會執行,至少不會在每個數據庫上執行。 但我不認爲這個重複的COUNT()真的會產生任何性能開銷。

+0

感謝您的快速回復! Postgres hadles這個沒關係。我知道這對性能並不重要,但它讓我感到不安,我想做正確的事情。 –

0
QVehicle qVehicle = QVehicle.vehicle; 

    NumberPath<Long> aliasQuantity = Expressions.numberPath(Long.class, "quantity"); 
    final List<QuantityByTypeVO> quantityByTypeVO = new JPAQueryFactory(getEntityManager()) 
      .select(Projections.constructor(QuantityByTypeVO.class, qVehicle.tipo, qVehicle.count().as(aliasQuantity))) 
      .from(qVehicle) 
      .groupBy(qVehicle.type) 
      .orderBy(aliasQuantity.desc()) 
      .fetch(); 

    select 
     vehicleges0_.type as col_0_0_, count(vehicleges0_.pk) as col_1_0_ 
    from vehicle vehicleges0_ 
    group by vehicleges0_.type 
    order by col_1_0_ desc; 

我做了類似的事情,但在訂購前我確實計算了一下。看看查詢和選擇生成。