【发布时间】:2014-11-22 09:22:27
【问题描述】:
原始功能 MySQL 查询列出了所有且仅列出了所有列出的标签的提供程序:
SELECT * FROM provider
INNER JOIN provider_tag
ON provider_tag.provider_id = provider.id AND provider_tag.tag_id in (1, 2)
GROUP BY (provider.id)
HAVING COUNT(*) = 2
在 Querydsl 中转换为 MySQLQuery 很简单...
MySQLQuery query = new MySQLQuery(conn, dialect);
List<Integer> tagIds = ...;
query.from(provider)
.innerJoin(provider_tag)
.on(providerTag.providerId.eq(provider.id), providerTag.tagId.in(tagIds))
.groupBy(provider.id)
.having(???);
...having 中的条件除外。
如何在查询中添加COUNT(*)?
在蒂莫的第一次更正建议后编辑:
所以,查询看起来像这样:
SearchResults<Tuple> result = query.from(provider)
.innerJoin(providerTag)
.on(providerTag.providerId.eq(provider.id), providerTag.tagId.in(tagIds))
.groupBy(provider.id)
.having(Wildcard.count.eq((long) tagIds.size()))
.listResults(
provider.id,
provider.name);
但是,如果结果集为空,这会导致 SQLException Illegal operation on empty result set。
我的其他返回空结果集的查询不会导致异常,所以我想我应该不需要捕获异常,但是有一个问题应该修复?
生成的 MySQL 运行良好(返回 0 行),所以问题不存在。
编辑 2:
问题出在groupBy()。如果应用issue 中显示的更正,这似乎可行。
【问题讨论】: