In my last post, I showed how you can pretty easily integrate ColdBox’s awesome CriteriaBuilder with subqueries. As I was using this approach, I came across another (unrelated) challenge that I wanted a solution for.

Simple Grouping/Summing

In one of my queries, I wanted to do some simple grouping/summing. With CriteriaBuilder, you can do this very easily by adding a projection or two.

For example, let’s imagine that we have the same entities as before:

  • Car
  • Driver
  • Insurance

This time, we want to get a sum of the total number of cars, grouped by “make”. Easy:

public struct function getCarsByMake() {
   var c  = newCriteria();
   c.withProjections( count="CarID", groupProperty="Make" );
   var results = {
       data = c.list()
   };
   results.count = arrayLen( results.data );
   return results;
}

And the SQL:

select this_.Make as y0_, count(this_.CarID) as y1_
from   Car this_
group by this_.Make

Pretty simple. By the application of the “count” and “groupProperty” projections, we get back a nice array of the grouped data. Note, of course, that because of the application of projections, our result set is no longer in the domain of discreet entities. Rather, since we asked for aggregate data, that’s what we get! Of course, this means that results.count has to be calculated differently. Instead of running CriteriaBuilder’s count() method More >