From 83350f944f0f874cfd3079ae4799fb55f3c797fb Mon Sep 17 00:00:00 2001 From: "emanuel.trandafir" Date: Fri, 19 Jan 2024 18:17:19 +0100 Subject: [PATCH 1/2] Fix Scala-generated QueryDSL path classes. Resolve the static field of the given type inside the specified domain class by considering both the provided Java and Scala object path class names. Useful for handling of Scala-generated QueryDSL path classes. Issue: 1392 --- .../querydsl/SimpleEntityPathResolver.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/org/springframework/data/querydsl/SimpleEntityPathResolver.java b/src/main/java/org/springframework/data/querydsl/SimpleEntityPathResolver.java index 46696242ba..0d7f79f963 100644 --- a/src/main/java/org/springframework/data/querydsl/SimpleEntityPathResolver.java +++ b/src/main/java/org/springframework/data/querydsl/SimpleEntityPathResolver.java @@ -71,6 +71,7 @@ public EntityPath createPath(Class domainClass) { Class pathClass = ClassUtils.forName(pathClassName, domainClass.getClassLoader()); return getStaticFieldOfType(pathClass)// + .or(() -> getFieldForScalaObject(domainClass, pathClassName))// .map(it -> (EntityPath) ReflectionUtils.getField(it, null))// .orElseThrow(() -> new IllegalStateException(String.format(NO_FIELD_FOUND_TEMPLATE, pathClass))); @@ -80,6 +81,23 @@ public EntityPath createPath(Class domainClass) { } } + /** + * Resolves the static field of the given type inside the specified domain class. + * Useful for handling Scala-generated QueryDSL path classes. + * + * @param domainClass The domain class for which the static field needs to be resolved. + * @param javaPathClassName The Java path class name without the "$" suffix. + * @return + */ + private Optional getFieldForScalaObject(Class domainClass, String javaPathClassName) { + try { + Class scalaPathClass = ClassUtils.forName(javaPathClassName + "$", domainClass.getClassLoader()); + return getStaticFieldOfType(scalaPathClass); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + /** * Returns the first static field of the given type inside the given type. * From 1f1f08c971c560b970952d22b612a20038f44a99 Mon Sep 17 00:00:00 2001 From: "emanuel.trandafir" Date: Fri, 19 Jan 2024 18:34:15 +0100 Subject: [PATCH 2/2] Changed Exception Type to IllegalArgumentException. Issue: #1392 --- .../data/querydsl/SimpleEntityPathResolver.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/querydsl/SimpleEntityPathResolver.java b/src/main/java/org/springframework/data/querydsl/SimpleEntityPathResolver.java index 0d7f79f963..8718eb2dad 100644 --- a/src/main/java/org/springframework/data/querydsl/SimpleEntityPathResolver.java +++ b/src/main/java/org/springframework/data/querydsl/SimpleEntityPathResolver.java @@ -31,6 +31,7 @@ * * @author Oliver Gierke * @author Jens Schauder + * @author Emanuel Trandafir */ public class SimpleEntityPathResolver implements EntityPathResolver { @@ -82,8 +83,8 @@ public EntityPath createPath(Class domainClass) { } /** - * Resolves the static field of the given type inside the specified domain class. - * Useful for handling Scala-generated QueryDSL path classes. + * Resolves the static field of the given type inside the specified domain class. Useful for handling Scala-generated + * QueryDSL path classes. * * @param domainClass The domain class for which the static field needs to be resolved. * @param javaPathClassName The Java path class name without the "$" suffix. @@ -91,10 +92,13 @@ public EntityPath createPath(Class domainClass) { */ private Optional getFieldForScalaObject(Class domainClass, String javaPathClassName) { try { + Class scalaPathClass = ClassUtils.forName(javaPathClassName + "$", domainClass.getClassLoader()); return getStaticFieldOfType(scalaPathClass); + } catch (ClassNotFoundException e) { - throw new RuntimeException(e); + throw new IllegalArgumentException( + String.format(NO_CLASS_FOUND_TEMPLATE, javaPathClassName + "$", domainClass.getName()), e); } }