我有一个包含产品的数据库表,想要通过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?
谢谢, 尼克
答案 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();