From 14849dbd69a782cdfbac3f528e42bd3065310dc7 Mon Sep 17 00:00:00 2001 From: JParams <26733487+jparams@users.noreply.github.com> Date: Fri, 13 Mar 2026 14:10:33 +0000 Subject: [PATCH] Fix generic type inference in NumberExpression sum() --- .../core/types/dsl/NumberExpression.java | 36 ++++++++++++++++--- .../core/types/dsl/NumberExpressionTest.java | 24 +++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/querydsl-core/src/main/java/com/querydsl/core/types/dsl/NumberExpression.java b/querydsl-core/src/main/java/com/querydsl/core/types/dsl/NumberExpression.java index 022c0dc287..b8a570e031 100644 --- a/querydsl-core/src/main/java/com/querydsl/core/types/dsl/NumberExpression.java +++ b/querydsl-core/src/main/java/com/querydsl/core/types/dsl/NumberExpression.java @@ -16,6 +16,8 @@ import com.querydsl.core.types.*; import com.querydsl.core.types.Ops.MathOps; import com.querydsl.core.util.MathUtils; +import java.math.BigDecimal; +import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import org.jetbrains.annotations.Nullable; @@ -747,6 +749,14 @@ public > NumberExpression subtract(N right) return Expressions.numberOperation(getType(), Ops.SUB, mixin, ConstantImpl.create(right)); } + @SuppressWarnings("unchecked") + private

> NumberExpression

sum(Class

clazz) { + if (sum == null) { + sum = (NumberExpression) Expressions.numberOperation(clazz, Ops.AggOps.SUM_AGG, mixin); + } + return (NumberExpression

) sum; + } + /** * Create a {@code sum(this)} expression * @@ -754,11 +764,29 @@ public > NumberExpression subtract(N right) * * @return sum(this) */ + @SuppressWarnings("unchecked") public NumberExpression sum() { - if (sum == null) { - sum = Expressions.numberOperation(getType(), Ops.AggOps.SUM_AGG, mixin); - } - return sum; + return sum((Class) getType()); + } + + /** {@link Float} {@link Double} are mapped to sumDouble. */ + public NumberExpression sumDouble() { + return sum(Double.class); + } + + /** {@link Byte} {@link Short} {@link Integer} {@link Long} are mapped to sumLong. */ + public NumberExpression sumLong() { + return sum(Long.class); + } + + /** {@link java.math.BigDecimal} are mapped to sumBigDecimal. */ + public NumberExpression sumBigDecimal() { + return sum(BigDecimal.class); + } + + /** {@link java.math.BigInteger} are mapped to sumBigInteger. */ + public NumberExpression sumBigInteger() { + return sum(BigInteger.class); } @Override diff --git a/querydsl-core/src/test/java/com/querydsl/core/types/dsl/NumberExpressionTest.java b/querydsl-core/src/test/java/com/querydsl/core/types/dsl/NumberExpressionTest.java index 3414f975f8..704207fbd6 100644 --- a/querydsl-core/src/test/java/com/querydsl/core/types/dsl/NumberExpressionTest.java +++ b/querydsl-core/src/test/java/com/querydsl/core/types/dsl/NumberExpressionTest.java @@ -15,6 +15,9 @@ import static org.junit.Assert.assertEquals; +import java.math.BigDecimal; +import java.math.BigInteger; + import org.junit.Test; public class NumberExpressionTest { @@ -30,4 +33,25 @@ public void between_start_given() { public void between_end_given() { assertEquals(intPath.loe(3L), intPath.between(null, 3L)); } + + @Test + public void sumBigDecimal_has_bigDecimal_type() { + assertEquals(BigDecimal.class, intPath.sumBigDecimal().getType()); + } + + @Test + public void sumBigInteger_has_bigInteger_type() { + assertEquals(BigInteger.class, intPath.sumBigInteger().getType()); + } + + @Test + public void sumDouble_has_double_type() { + assertEquals(Double.class, intPath.sumDouble().getType()); + } + + @Test + public void sumLong_has_long_type() { + assertEquals(Long.class, intPath.sumLong().getType()); + } + }