blaze-persistence icon indicating copy to clipboard operation
blaze-persistence copied to clipboard

QueryDSL and EntitiView error in the object constructor

Open MaykoST opened this issue 3 years ago • 14 comments

I'm trying to use the QueryDSL integration with EntityViews as suggested here https://github.com/Blazebit/blaze-persistence/issues/1643, but i found a problem in the object construction code.

Code: image

Map: image

Error: image

As can be seen in the image the wrong positions are used to access the object in the array.

My dependencies

querydsl:4.1.4 spring-boot:2.0.0 spring:5.0.4 laze-persistence: 1.6.8

java8

MaykoST avatar Nov 25 '22 19:11 MaykoST

I think if you use evm.applySetting you should remove any select statement from your query.

jwgmeligmeyling avatar Nov 25 '22 20:11 jwgmeligmeyling

I tried it before, but i got another error

image

stackTrace: java.lang.NullPointerException at com.blazebit.persistence.querydsl.BlazeCriteriaBuilderRenderer$CTERenderVisitor.visit(BlazeCriteriaBuilderRenderer.java:1526) at com.querydsl.core.types.SubQueryExpressionImpl.accept(SubQueryExpressionImpl.java:57) at com.querydsl.core.support.FetchableSubQueryBase.accept(FetchableSubQueryBase.java:150) at com.blazebit.persistence.querydsl.BlazeCriteriaBuilderRenderer.renderCTEs(BlazeCriteriaBuilderRenderer.java:367) at com.blazebit.persistence.querydsl.BlazeCriteriaBuilderRenderer.render(BlazeCriteriaBuilderRenderer.java:130) at com.betha.pessoal.folha.integracao.esocial.application.ESocialResource.buscaConfiguracao(ESocialResource.java:158) at com.betha.pessoal.folha.integracao.esocial.application.ESocialResource$$FastClassBySpringCGLIB$$8ca41cf5.invoke() at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:747) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) at com.betha.pessoal.folha.integracao.esocial.application.ESocialResource$$EnhancerBySpringCGLIB$$d25b058b.buscaConfiguracao() at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:870) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:776) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870) at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855) at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:158) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:126) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:111) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:84) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:750)

MaykoST avatar Nov 25 '22 21:11 MaykoST

Yeah, I think the NPE there is wrong. We should fix it.

beikov avatar Nov 26 '22 08:11 beikov

Are you sure you have shared the full query with us however? This method is for rendering CTE's and not simple queries like the one demonstrated in the issue.

jwgmeligmeyling avatar Nov 26 '22 13:11 jwgmeligmeyling

Yes i did, I added the screenshot of the code. I also found it strange that the error happened in the cte-related part, but that was exactly the code I ran. The NPE happens if i remove the select part.

MaykoST avatar Nov 28 '22 11:11 MaykoST

Hi. I am facing the same issue. Could you provide a deeper explanation on the NPE problem? Is there any workaround to get working the queryDSL integration with Entity Views at the moment, please?

NorbertKominak avatar Mar 24 '23 15:03 NorbertKominak

It would be very helpful if you could provide us a reproducer for this issue. Maybe try using the archetype for this purpose: mvn archetype:generate "-DarchetypeGroupId=com.blazebit" "-DarchetypeArtifactId=blaze-persistence-archetype-entity-view-sample" "-DarchetypeVersion=1.6.8"

beikov avatar Mar 24 '23 15:03 beikov

Thanks for a really quick reply! Please find the reproducer here https://github.com/NorbertKominak/BlazePersistenceEntityViewError. It is a simple Spring Boot app.

NorbertKominak avatar Mar 26 '23 10:03 NorbertKominak

Thanks for a really quick reply! Please find the reproducer here https://github.com/NorbertKominak/BlazePersistenceEntityViewError. It is a simple Spring Boot app.

@beikov could you confirm if you can run the reproducer and see the error, please?

NorbertKominak avatar Mar 29 '23 06:03 NorbertKominak

Thanks for the reproducer. I didn't try it myself, but since @jwgmeligmeyling will be working on this, I'm sure he has :)

beikov avatar Mar 29 '23 06:03 beikov

@jwgmeligmeyling Is there any workaround at the moment on how to avoid the NPE and use queryDSL with the Entity View module, please?

NorbertKominak avatar Mar 30 '23 07:03 NorbertKominak

I don't think there is an easy workaround although it should be relatively easy to fix.

Basically add a null-check on the result of queryMetadata.getProjection() here and here.

I am currently working on Hibernate 6 support for Querydsl, Querydsl Hibernate Types and Querydsl Blaze-Persistence integrations, so I can't pick this up right now but I'll try to squeeze it in before the next Blaze-Persistence release.

jwgmeligmeyling avatar Mar 30 '23 10:03 jwgmeligmeyling

I don't think there is an easy workaround although it should be relatively easy to fix.

Basically add a null-check on the result of queryMetadata.getProjection() here and here.

I am currently working on Hibernate 6 support for Querydsl, Querydsl Hibernate Types and Querydsl Blaze-Persistence integrations, so I can't pick this up right now but I'll try to squeeze it in before the next Blaze-Persistence release.

Thanks! When is the next released planned, please?

NorbertKominak avatar Mar 30 '23 10:03 NorbertKominak

The next release is dependent on Spring Boot 3 and Hibernate 6.2 support, and it currently looks like this will take at least 2 more weeks.

beikov avatar Mar 30 '23 11:03 beikov