querydsl transformer group by count

20,291

Solution 1

transform combined groupBy is meant to construct tree structures out of flat result sets. What you need can be easier expressed as

query.from(application)
     .groupBy(application.category)
     .list(application.category, application.category.count())

Solution 2

Note that as of Querydsl 4.x, the accepted answer by Timo Westkämper is no longer valid. Breaking changes in Querydsl 4.0 have removed the query.list() method.

A solution working with Querydsl 4.0+ would now be:

query.from(application)
     .groupBy(application.category)
     .select(application.category, application.category.count())
     .fetch();

Solution 3

If using 4.1.4, you may need to use a JPAQueryFactory instead of JPAQuery

If using JPAQuery, there is no select() or fetch() on the return from groupBy.

JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);

queryFactory
     .select(application.category, application.category.count())
     .from(application)
     .groupBy(application.category)
     .fetch();
Share:
20,291
Wouter Willems
Author by

Wouter Willems

I work at http://www.magnet.me as an allround developer. Programming with languages for both back-end and front-end purposes. My biggest skillset and interest lay within front-end coding (angular) right now.

Updated on October 03, 2020

Comments

  • Wouter Willems
    Wouter Willems about 3 years

    I am stuck trying to get a query (QueryDSL) to work that gives me a count of distinct categories. For example, what I am trying to achieve:

    categoryA -> 10 entries
    categoryB -> 20 entries
    

    This is what i have so far:

    query().from(application)
                .transform(groupBy(application.category).as(list(application)));
    

    However, this gives me for each category a list of all whole entries, I just want to get a count of this.

    I tried messing around with count() but no luck.

    Anybody know how to do this?