微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 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生成两个COUNT():

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

我没有从文档中理解这一点,如果可能,请给我一些指示.

解决方法:

    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;

我做了类似的事情,但在订购之前我确实算过了.查看查询生成的选择.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐