my2iu / Jinq

LINQ-style queries for Java 8
Other
659 stars 71 forks source link

Where filtering after select with projection gives error #87

Closed jvitor83 closed 4 years ago

jvitor83 commented 4 years ago

Where filtering AFTER select with projection gives error

JinqJPAStreamProvider jinqJPAStreamProvider = new JinqJPAStreamProvider(this.entityManager.getMetamodel());
jinqJPAStreamProvider.registerCustomTupleConstructor(PessoaVO.class.getConstructor(Long.class, String.class), PessoaVO.class.getMethod("getFullName"), PessoaVO.class.getMethod("getId"));

JPAJinqStream<Pessoa> pessoaStream = jinqJPAStreamProvider.streamAll(this.entityManager, Pessoa.class);
// pessoaStream = pessoaStream.where(c -> c.getFirstName().equals("Joao"));
// This works fine

JPAJinqStream<PessoaVO> pessoaVOStream = pessoaStream.select(a -> new PessoaVO(a.getId(), a.getFirstName() + a.getLastName()));
pessoaVOStream = pessoaVOStream.where(p -> p.getFullName().equals("JoaoCarmo"));
// This breaks when the toList() is executed

List<PessoaVO> objetcts = pessoaVOStream.toList();

The exception: image

javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not prepare statement\r\n\tat org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)\r\n\tat org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)\r\n\tat org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1514)\r\n\tat org.hibernate.query.Query.getResultList(Query.java:135)\r\n\tat org.jinq.jpa.JPAQueryComposer$1.generateNext(JPAQueryComposer.java:211)\r\n\tat org.jinq.orm.stream.NextOnlyIterator.hasNext(NextOnlyIterator.java:27)\r\n\tat java.util.Iterator.forEachRemaining(Iterator.java:115)\r\n\tat java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)\r\n\tat java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)\r\n\tat java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)\r\n\tat java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)\r\n\tat java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\r\n\tat java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)\r\n\tat org.jinq.orm.stream.LazyWrappedStream.collect(LazyWrappedStream.java:228)\r\n\tat org.jinq.orm.stream.NonQueryJinqStream.toList(NonQueryJinqStream.java:492)\r\n\tat com.hackerrank.projects.controllers.GreetingsController.greetingText(GreetingsController.java:132)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\r\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.lang.reflect.Method.invoke(Method.java:498)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)\r\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:634)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:741)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\r\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.lang.Thread.run(Thread.java:748)\r\nCaused by: org.hibernate.exception.DataException: could not prepare statement\r\n\tat org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:118)\r\n\tat org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)\r\n\tat org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)\r\n\tat org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182)\r\n\tat org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:148)\r\n\tat org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1984)\r\n\tat org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1914)\r\n\tat org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1892)\r\n\tat org.hibernate.loader.Loader.doQuery(Loader.java:937)\r\n\tat org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:340)\r\n\tat org.hibernate.loader.Loader.doList(Loader.java:2689)\r\n\tat org.hibernate.loader.Loader.doList(Loader.java:2672)\r\n\tat org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2506)\r\n\tat org.hibernate.loader.Loader.list(Loader.java:2501)\r\n\tat org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:504)\r\n\tat org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:395)\r\n\tat org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:220)\r\n\tat org.hibernate.internal.SessionImpl.list(SessionImpl.java:1508)\r\n\tat org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1537)\r\n\tat org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1505)\r\n\t... 67 more\r\nCaused by: org.h2.jdbc.JdbcSQLException: Data conversion error converting \"JoaoCarmo\"; SQL statement:\n/* SELECT A.id, CONCAT(A.firstName, A.lastName) FROM Pessoa A WHERE A.id = 'JoaoCarmo' */ select pessoa0_.id as col_0_0_, (pessoa0_.first_name||pessoa0_.last_name) as col_1_0_ from pessoa pessoa0_ where pessoa0_.id='JoaoCarmo' limit ? [22018-197]\r\n\tat org.h2.message.DbException.getJdbcSQLException(DbException.java:357)\r\n\tat org.h2.message.DbException.get(DbException.java:168)\r\n\tat org.h2.value.Value.convertTo(Value.java:1116)\r\n\tat org.h2.expression.Comparison.optimize(Comparison.java:204)\r\n\tat org.h2.command.dml.Select.prepare(Select.java:861)\r\n\tat org.h2.command.Parser.prepareCommand(Parser.java:283)\r\n\tat org.h2.engine.Session.prepareLocal(Session.java:611)\r\n\tat org.h2.engine.Session.prepareCommand(Session.java:549)\r\n\tat org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1247)\r\n\tat org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:76)\r\n\tat org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:304)\r\n\tat com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:311)\r\n\tat com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java)\r\n\tat org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:146)\r\n\tat org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)\r\n\t... 83 more\r\nCaused by: java.lang.NumberFormatException: For input string: \"JoaoCarmo\"\r\n\tat java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)\r\n\tat java.lang.Long.parseLong(Long.java:589)\r\n\tat java.lang.Long.parseLong(Long.java:631)\r\n\tat org.h2.value.Value.convertTo(Value.java:1063)\r\n\t... 95 more\r\n

Important part: Caused by: org.h2.jdbc.JdbcSQLException: Data conversion error converting \"JoaoCarmo\"; SQL statement:\n/* SELECT A.id, CONCAT(A.firstName, A.lastName) FROM Pessoa A WHERE A.id = 'JoaoCarmo' */ select pessoa0_.id as col_0_0_, (pessoa0_.first_name||pessoa0_.last_name) as col_1_0_ from pessoa pessoa0_ where pessoa0_.id='JoaoCarmo' limit ?

By what i see, it is getting the first parameter and not the projected fullName (result of a concat).

my2iu commented 4 years ago

I think you’ve registered the custom tuple constructor incorrectly. You’ve registered getFullName() as the Long, and getId() as the String.

jvitor83 commented 4 years ago

Thanks @my2iu ! It went unnoticed! It worked!