diff --git a/pom.xml b/pom.xml index 25fcbfa1b1..6200689751 100644 --- a/pom.xml +++ b/pom.xml @@ -117,7 +117,7 @@ 1.0.0.RELEASE - 7.2.6.Final + 7.3.1.Final 9.1.0.Final 5.0.0-B13 3.2.0 diff --git a/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java b/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java index 926e33401f..82d63652ae 100644 --- a/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java +++ b/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java @@ -427,10 +427,10 @@ public Void visit(SubQueryExpression query, Void context) { && modifiers.isRestricting() && templates.isSubQueryModifiersSupported()) { if (modifiers.getLimit() != null) { - append(LIMIT).handle(modifiers.getLimit()); + append(LIMIT).handle(modifiers.getLimitAsInteger()); } if (modifiers.getOffset() != null) { - append(OFFSET).handle(modifiers.getOffset()); + append(OFFSET).handle(modifiers.getOffsetAsInteger()); } } diff --git a/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/hibernate/HibernateUtil.java b/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/hibernate/HibernateUtil.java index 48d49d5eb4..fc50431bdb 100644 --- a/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/hibernate/HibernateUtil.java +++ b/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/hibernate/HibernateUtil.java @@ -108,8 +108,6 @@ private static void setValueWithNumberedLabel( query.setParameterList(key, collection); } else if (val instanceof Object[] objects && !BUILT_IN.contains(val.getClass())) { query.setParameterList(key, objects); - } else if (val instanceof Number && TYPES.containsKey(val.getClass())) { - query.setParameter(key, val, getType(val.getClass())); } else { query.setParameter(key, val); } diff --git a/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/impl/JPAUtil.java b/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/impl/JPAUtil.java index adacb516c3..2dec829aa3 100644 --- a/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/impl/JPAUtil.java +++ b/querydsl-libraries/querydsl-jpa/src/main/java/com/querydsl/jpa/impl/JPAUtil.java @@ -29,6 +29,20 @@ */ public final class JPAUtil { + private static final Map, Class> PRIMITIVE_TO_WRAPPER = + Map.of( + int.class, Integer.class, + long.class, Long.class, + double.class, Double.class, + float.class, Float.class, + short.class, Short.class, + byte.class, Byte.class); + + @SuppressWarnings("unchecked") + private static Class primitiveToWrapper(Class type) { + return (Class) PRIMITIVE_TO_WRAPPER.getOrDefault(type, type); + } + private JPAUtil() {} public static void setConstants( @@ -50,8 +64,9 @@ public static void setConstants( Parameter parameter = query.getParameter(i + 1); var parameterType = parameter != null ? parameter.getParameterType() : null; if (parameterType != null && !parameterType.isInstance(val)) { - if (val instanceof Number number && Number.class.isAssignableFrom(parameterType)) { - val = MathUtils.cast(number, parameterType); + var targetType = primitiveToWrapper(parameterType); + if (val instanceof Number number && Number.class.isAssignableFrom(targetType)) { + val = MathUtils.cast(number, targetType); } } } diff --git a/querydsl-libraries/querydsl-jpa/src/test/java/com/querydsl/jpa/JPQLSerializerTest.java b/querydsl-libraries/querydsl-jpa/src/test/java/com/querydsl/jpa/JPQLSerializerTest.java index 108cd126a3..47dc4ba9e1 100644 --- a/querydsl-libraries/querydsl-jpa/src/test/java/com/querydsl/jpa/JPQLSerializerTest.java +++ b/querydsl-libraries/querydsl-jpa/src/test/java/com/querydsl/jpa/JPQLSerializerTest.java @@ -395,7 +395,7 @@ public void visit_subQueryExpression_with_limit_hql() { assertThat(serializer.toString()).isEqualTo("(select cat.id\nfrom Cat cat\nlimit ?1)"); assertThat(serializer.getConstants()).hasSize(1); - assertThat(serializer.getConstants().getFirst()).isEqualTo(5L); + assertThat(serializer.getConstants().getFirst()).isEqualTo(5); } @Test @@ -418,7 +418,7 @@ public void visit_subQueryExpression_with_offset_hql() { assertThat(serializer.toString()).isEqualTo("(select cat.id\nfrom Cat cat\noffset ?1)"); assertThat(serializer.getConstants()).hasSize(1); - assertThat(serializer.getConstants().getFirst()).isEqualTo(10L); + assertThat(serializer.getConstants().getFirst()).isEqualTo(10); } @Test @@ -442,8 +442,8 @@ public void visit_subQueryExpression_with_limit_and_offset_hql() { assertThat(serializer.toString()) .isEqualTo("(select cat.id\nfrom Cat cat\nlimit ?1\noffset ?2)"); assertThat(serializer.getConstants()).hasSize(2); - assertThat(serializer.getConstants().get(0)).isEqualTo(5L); - assertThat(serializer.getConstants().get(1)).isEqualTo(10L); + assertThat(serializer.getConstants().get(0)).isEqualTo(5); + assertThat(serializer.getConstants().get(1)).isEqualTo(10); } @Test @@ -469,8 +469,8 @@ where cat.id in (select mate.id limit ?1) limit ?2)"""); assertThat(serializer.getConstants()).hasSize(2); - assertThat(serializer.getConstants().get(0)).isEqualTo(3L); - assertThat(serializer.getConstants().get(1)).isEqualTo(5L); + assertThat(serializer.getConstants().get(0)).isEqualTo(3); + assertThat(serializer.getConstants().get(1)).isEqualTo(5); } @Test @@ -537,8 +537,8 @@ where cat.id in (select kitten.id limit ?1 offset ?2)"""); assertThat(hqlSerializer.getConstants()).hasSize(2); - assertThat(hqlSerializer.getConstants().get(0)).isEqualTo(5L); - assertThat(hqlSerializer.getConstants().get(1)).isEqualTo(10L); + assertThat(hqlSerializer.getConstants().get(0)).isEqualTo(5); + assertThat(hqlSerializer.getConstants().get(1)).isEqualTo(10); } @Test @@ -601,7 +601,7 @@ public void subquery_in_select_clause_with_modifiers_hql() { offset ?2) from Cat cat"""); assertThat(hqlSerializer.getConstants()).hasSize(2); - assertThat(hqlSerializer.getConstants().get(0)).isEqualTo(1L); - assertThat(hqlSerializer.getConstants().get(1)).isEqualTo(2L); + assertThat(hqlSerializer.getConstants().get(0)).isEqualTo(1); + assertThat(hqlSerializer.getConstants().get(1)).isEqualTo(2); } } diff --git a/querydsl-tooling/querydsl-jpa-codegen/src/test/java/com/querydsl/jpa/codegen/JPADomainExporterTest.java b/querydsl-tooling/querydsl-jpa-codegen/src/test/java/com/querydsl/jpa/codegen/JPADomainExporterTest.java index 0e2a38c57e..a7f03e3c5d 100644 --- a/querydsl-tooling/querydsl-jpa-codegen/src/test/java/com/querydsl/jpa/codegen/JPADomainExporterTest.java +++ b/querydsl-tooling/querydsl-jpa-codegen/src/test/java/com/querydsl/jpa/codegen/JPADomainExporterTest.java @@ -69,6 +69,15 @@ public void test() throws IOException { var origFile = origRoot.toPath().resolve(relativeFile); var reference = new String(Files.readAllBytes(origFile), StandardCharsets.UTF_8); var content = new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8); + + if (file.getName().equals("QCalendar.java")) { + // The APT processor does not apply @Temporal(TemporalType.DATE) to @ElementCollection + // map values, so it generates DateTimePath for java.util.Date. The JPADomainExporter + // correctly reads @Temporal from the Hibernate metamodel and generates DatePath. + // Hibernate 7.3+ fixed metamodel exposure of @Temporal for map attributes. + reference = reference.replace("DateTimePath", "DatePath"); + } + assertThat(content).as("Mismatch for " + file.getName() + "\n").isEqualTo(reference); } } diff --git a/querydsl-tooling/querydsl-jpa-codegen/src/test/java/com/querydsl/jpa/codegen/ant/AntJPADomainExporterTest.java b/querydsl-tooling/querydsl-jpa-codegen/src/test/java/com/querydsl/jpa/codegen/ant/AntJPADomainExporterTest.java index 0522df1d29..4fbbc55786 100644 --- a/querydsl-tooling/querydsl-jpa-codegen/src/test/java/com/querydsl/jpa/codegen/ant/AntJPADomainExporterTest.java +++ b/querydsl-tooling/querydsl-jpa-codegen/src/test/java/com/querydsl/jpa/codegen/ant/AntJPADomainExporterTest.java @@ -35,6 +35,15 @@ public void test() throws IOException { var reference = new String(java.nio.file.Files.readAllBytes(origFile), StandardCharsets.UTF_8); var content = new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8); + + if (file.getName().equals("QCalendar.java")) { + // The APT processor does not apply @Temporal(TemporalType.DATE) to @ElementCollection + // map values, so it generates DateTimePath for java.util.Date. The JPADomainExporter + // correctly reads @Temporal from the Hibernate metamodel and generates DatePath. + // Hibernate 7.3+ fixed metamodel exposure of @Temporal for map attributes. + reference = reference.replace("DateTimePath", "DatePath"); + } + assertThat(content).withFailMessage("Mismatch for %s", file.getPath()).isEqualTo(reference); } }