2016-07-22 22 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; 

我做了类似的事情,但在订购前我确实计算了一下。看看查询和选择生成。