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);
}
}