Skip to content

Querydsl collections fails to generate and execute query in spring web projects #851

@rnilss47

Description

@rnilss47

Querydsl fails to generate and execute queries inside threads used by Spring to handle requests. The following simple code:

@RestController
@SpringBootApplication
public class TestApplication {
    private static final List<Cat> CATS = List.of(new Cat("Felix"), new Cat("Garfield"));

    public static void main(final String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

    @RequestMapping("/")
    public List<Cat> home() {
        return CollQueryFactory.from(QCat.cat, CATS)
                .where(QCat.cat.name.eq("Garfield"))
                .stream()
                .toList();
    }
}

produces this error:

2025-01-29T09:42:03.822+01:00 ERROR 1190827 --- [test] [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: com.querydsl.codegen.utils.CodegenException: Compilation of public class Q_252532505_1275614662_1275614662_1195259493 {

    public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
for (com.example.Cat cat : cat_) {
    try {
        if (com.querydsl.collections.CollQueryFunctions.equals(cat.getName(), a1)) {
            rv.add(cat);
        }
    } catch (NullPointerException npe) { }
}
return rv;    }

}

 failed.
/Q_252532505_1275614662_1275614662_1195259493.java:3: error: package com.example does not exist
    public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
                                                                     ^
/Q_252532505_1275614662_1275614662_1195259493.java:3: error: package com.example does not exist
    public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
                                      ^
/Q_252532505_1275614662_1275614662_1195259493.java:4: error: package com.example does not exist
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
                          ^
/Q_252532505_1275614662_1275614662_1195259493.java:4: error: package com.example does not exist
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
                                                                        ^
/Q_252532505_1275614662_1275614662_1195259493.java:5: error: package com.example does not exist
for (com.example.Cat cat : cat_) {
                ^
/Q_252532505_1275614662_1275614662_1195259493.java:7: error: package com.querydsl.collections does not exist
        if (com.querydsl.collections.CollQueryFunctions.equals(cat.getName(), a1)) {
                                    ^
6 errors
] with root cause

com.querydsl.codegen.utils.CodegenException: Compilation of public class Q_252532505_1275614662_1275614662_1195259493 {

    public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
for (com.example.Cat cat : cat_) {
    try {
        if (com.querydsl.collections.CollQueryFunctions.equals(cat.getName(), a1)) {
            rv.add(cat);
        }
    } catch (NullPointerException npe) { }
}
return rv;    }

}

 failed.
/Q_252532505_1275614662_1275614662_1195259493.java:3: error: package com.example does not exist
    public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
                                                                     ^
/Q_252532505_1275614662_1275614662_1195259493.java:3: error: package com.example does not exist
    public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
                                      ^
/Q_252532505_1275614662_1275614662_1195259493.java:4: error: package com.example does not exist
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
                          ^
/Q_252532505_1275614662_1275614662_1195259493.java:4: error: package com.example does not exist
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
                                                                        ^
/Q_252532505_1275614662_1275614662_1195259493.java:5: error: package com.example does not exist
for (com.example.Cat cat : cat_) {
                ^
/Q_252532505_1275614662_1275614662_1195259493.java:7: error: package com.querydsl.collections does not exist
        if (com.querydsl.collections.CollQueryFunctions.equals(cat.getName(), a1)) {
                                    ^
6 errors

	at com.querydsl.codegen.utils.JDKEvaluatorFactory.compile(JDKEvaluatorFactory.java:83) ~[querydsl-codegen-utils-6.10.1.jar:na]
	at com.querydsl.codegen.utils.AbstractEvaluatorFactory.createEvaluator(AbstractEvaluatorFactory.java:146) ~[querydsl-codegen-utils-6.10.1.jar:na]
	at com.querydsl.collections.DefaultEvaluatorFactory.createEvaluator(DefaultEvaluatorFactory.java:164) ~[querydsl-collections-6.10.1.jar:na]
	at com.querydsl.collections.DefaultQueryEngine.evaluateSingleSource(DefaultQueryEngine.java:175) ~[querydsl-collections-6.10.1.jar:na]
	at com.querydsl.collections.DefaultQueryEngine.list(DefaultQueryEngine.java:89) ~[querydsl-collections-6.10.1.jar:na]
	at com.querydsl.collections.AbstractCollQuery.fetch(AbstractCollQuery.java:195) ~[querydsl-collections-6.10.1.jar:na]
	at com.querydsl.collections.AbstractCollQuery.stream(AbstractCollQuery.java:188) ~[querydsl-collections-6.10.1.jar:na]
	at com.example.TestApplication.home(TestApplication.java:29) ~[classes/:na]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:257) ~[spring-web-6.2.2.jar:6.2.2]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190) ~[spring-web-6.2.2.jar:6.2.2]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.2.jar:6.2.2]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986) ~[spring-webmvc-6.2.2.jar:6.2.2]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891) ~[spring-webmvc-6.2.2.jar:6.2.2]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.2.jar:6.2.2]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1088) ~[spring-webmvc-6.2.2.jar:6.2.2]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:978) ~[spring-webmvc-6.2.2.jar:6.2.2]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.2.jar:6.2.2]
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.2.2.jar:6.2.2]
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.34.jar:6.0]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.2.2.jar:6.2.2]
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.34.jar:6.0]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.34.jar:10.1.34]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.2.2.jar:6.2.2]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.2.jar:6.2.2]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.2.2.jar:6.2.2]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.2.jar:6.2.2]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.2.2.jar:6.2.2]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.2.jar:6.2.2]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
	at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]

I found one workaround that seems to fix the issue. That is to run a dummy query in the main thread at the startup of the application. If I modify the main method like this then the issue goes away.

  public static void main(final String[] args) {
      SpringApplication.run(TestApplication.class, args);

      CollQueryFactory.from(QCat.cat, CATS)
              .where(QCat.cat.name.eq("Garfield"))
              .stream()
              .toList();
  }

I'm not sure what the issue is, but the workaround I found seems to indicate that this has something to do with threads and possible classpaths and classloaders.

Here is a repository that contains the minimal code required to reproduce this bug: https://github.com/rnilss47/querydsl-reproduce-collections-bug.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions