Querydsl变换与group by和having

时间:2017-08-20 12:03:57

标签: java sql querydsl

我有一个包含产品的数据库表,想要通过Querydsl

查找具有相同名称的产品

我有这样的事情:

QProduct product = QProduct.product;
JPAQuery query = new JPAQuery(entityManager);

Map<String, List<Product>> = query.from(product)
            .transform(groupBy(product.name).as(list(product)));

然后我得到一个产品名称为密钥的地图。对于每个名称密钥,我都会得到一个包含此名称的产品的列表。 由于我想找到名称重复,我只需要大于1的产品列表。所以我需要一个带有嵌套SQL语句的where子句来忽略具有唯一名称的产品:

SELECT * FROM Product p1
  WHERE (SELECT COUNT(*) FROM Product p2 WHERE p1.name=p2.name)>1 

如何在上面的querydsl查询中包含它。或者是否有另一种方法可以将地图中的产品列表限制为仅大于1的列表。

也许有可能在querydsl中使用HAVING COUNT?

谢谢, 尼克

1 个答案:

答案 0 :(得分:0)

一年后的一天……某人(几乎)遇到了同样的问题……并找到了解决方案! =)

下面的示例不是解决问题的方法,而是提示如何将hading语句转换为变换投影。我希望这至少对某人有帮助! :)

    QStagingData data = QStagingData.stagingData;
    List<StagingDataPlausiProjection> transform = new JPAQuery<>(getEntityManager())
            .select(Projections.bean(StagingDataPlausiProjection.class,
                    data.branch, data.account, data.costCenter, data.receiptMonth))
            .where(data.tenant.eq(tenant).and(data.bookingYear.eq(year)))
            .groupBy(data.branch, data.account, data.costCenter, data.receiptMonth)
            .having(data.value.sum().ne(BigDecimal.ZERO))
            .fetch();