Search code examples
javaquerydsl

QueryDSL - Sum where a join is involed


Given the following classes:

class User {
    @OneToMany
    Set<Transaction> transactions
}

class Transaction {
     BigDecimal money;
}

I'm stumped how to perform an aggregate, as the functions don't appear to be available on a the following query:

QUser $user = QUser.user;
QTransaction $transaction = QTransaction.transaction;
query().from($user)
    .innerJoint($user.transactions, $transaction)
    .where($user.eq(myUser))
    // Now what?

As a bonus -- is this possible if the money is persisted as a Joda Money type, rather than as a BigDecimal?

(I'm using UserType's Joda Money support to facilitate persistence)


Solution

  • Something like this should work

    QUser $user = QUser.user;
    QTransaction $transaction = QTransaction.transaction;
    query().from($user)
        .innerJoin($user.transactions, $transaction) //inner join clause
        .where($user.eq(myUser))
        .singleResult($transaction.money.sum());
    

    Querydsl doesn't have (yet) direct support for Joda Money, so using Joda Money the sum() method won't be available directly.