Hi Mark, Here is the code I mentioned if you want to try it (again, 3.0.2 -- might need tweaked for 3.1):
Actual utility code: https://github.com/mrg/cbe/blob/master/FetchingObjects/Aggregates/src/main/java/cbe/fetching/utilities/AggregateUtils.java https://github.com/mrg/cbe/blob/master/FetchingObjects/Aggregates/src/main/java/cbe/fetching/utilities/AggregateTranslator.java Example that uses it: https://github.com/mrg/cbe/blob/master/FetchingObjects/Aggregates/src/main/java/cbe/fetching/Aggregates.java In your Order class, you could create a method: public int getPackageCount() { // Use AggregateUtils to perform a COUNT on Packages matching this Order. // query = new SelectQuery(Package.class); // query.setQualifier(ExpressionFactory.matcExp(Package.ORDER_PROPERTY, this)); // return AggregateUtils.count(getDataContext(), query); } This might be too slow if you need to do a LOT of Orders' Package counts at once, but if nothing else, maybe it'll prove helpful/useful somewhere. mrg PS. I'm sure there are typos above...didn't test any of it. :-) On Thu, Oct 30, 2014 at 6:38 PM, Mark Stobbe <[email protected]> wrote: > @Andrus, I see. Good to know how to do this in Cayenne. > > @Michael, You are right. It makes more sense to let the database do the > calculations. It prevents the race conditions when updating and ensures > totals to be correct. > My problem with the solution is just the integration into Cayenne. > Do you use some extra classes to keep the totals? It would be perfect if the > expression language could be extended to have an easy way to group and count > associated entities!! > > >> On 30 okt. 2014, at 18:22, Michael Gentry <[email protected]> wrote: >> >> The utilities I mentioned also do SUM, AVG, MIN, and MAX ... >> >> >>> On Thu, Oct 30, 2014 at 12:35 PM, Mark Stobbe <[email protected]> >>> wrote: >>> Oh, I also have the same problem with total cost with different >>> currencies... >>> >>>> On Thu, Oct 30, 2014 at 5:09 PM, Mark Stobbe <[email protected]> >>>> wrote: >>>> >>>> Hi Michael, >>>> >>>> I would like to display the count in a table for a whole bunch of orders. >>>> In theory I could use a "group by"-query to get the numbers I need and >>>> with proper configured indices this should be fairly quick, I guess. >>>> >>>> Is there a more transparent way of doing things, e.g. using lifecycle >>>> listeners, datachannel filters and such? >>>> >>>> Mark >>>> >>>> On Thu, Oct 30, 2014 at 4:15 PM, Michael Gentry <[email protected]> >>>> wrote: >>>> >>>>> Hi Mark, >>>>> >>>>> Is there a performance reason why you don't just do a count on the >>>>> packages that match the order? >>>>> >>>>> mrg >>>>> >>>>> >>>>> On Thu, Oct 30, 2014 at 11:00 AM, Mark Stobbe <[email protected]> >>>>> wrote: >>>>>> Hi all, >>>>>> >>>>>> I was wondering what is the best way to update totals in a multi-user >>>>>> environment. For example, let's say we have an Order which can have one >>>>> or >>>>>> more Packages associated and we want to maintain a total package count >>>>> on >>>>>> the Order entity. How would you update this value when the user has the >>>>>> option to add/remove packages. >>>>>> >>>>>> So the entities looks like: >>>>>> >>>>>> *Order* >>>>>> -------- >>>>>> id : bigint >>>>>> orderNumber : varchar >>>>>> nrOfPackages : int >>>>>> >>>>>> *Package* >>>>>> ------------ >>>>>> id : bigint >>>>>> packageNumber : varchar >>>>>> *fk_order : bigint* >>>>>> >>>>>> What do you guys use to solve this? >>>>>> Mark >>>> >>>>
