数据库
首页 > 数据库> > java – Querydsl / MySQL上的Count(*)(星号)?

java – Querydsl / MySQL上的Count(*)(星号)?

作者:互联网

最初的功能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(???);

……除了有条件.

如何在查询中添加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非法操作.

我的其他返回空结果集的查询不会导致异常,所以我想我不应该捕获异常,但是有一个问题需要修复?

生成的MySQL工作正常(返回0行),所以问题不存在.

编辑2:

问题出在groupBy()中.如果应用issue中显示的校正,这似乎有效.

解决方法:

COUNT(*)的querydsl等价物是Wildcard.count.

标签:querydsl,java,mysql
来源: https://codeday.me/bug/20190728/1560594.html