【问题标题】:Querydsl transform with group by and havingQuerydsl 转换与 group by 并具有
【发布时间】:2018-01-28 15:10:15
【问题描述】:

我有一个包含产品的数据库表,想通过 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?

谢谢, 尼克

【问题讨论】:

  • 真的没人吗?

标签: java sql querydsl


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多