OpenLiberty / open-liberty

Open Liberty is a highly composable, fast to start, dynamic application server runtime environment
https://openliberty.io
Eclipse Public License 2.0
1.13k stars 578 forks source link

this.name disappears from JPQL DELETE query #28895

Open njr-11 opened 1 week ago

njr-11 commented 1 week ago

In our attempt to switch to JPQL from Jakarta Persistence 3.2, we sent the following JPQL DELETE query to EclipseLink EntityManager.createQuery, DELETE FROM Product WHERE this.name LIKE ?1, and it seems to be losing this.name from it,

[6/26/24, 9:49:58:186 CDT] 00000055 id=15ef1519 io.openliberty.data.internal.persistence.RepositoryImpl      > invoke MultiRepository.destroy Entry  
                                                                                                               TestFromClauseIdentifiesEntity-%
[6/26/24, 9:49:58:186 CDT] 00000055 id=15ef1519 io.openliberty.data.internal.persistence.RepositoryImpl      3 QueryInfo@4c3f8c74 long destroy(String) DELETE FROM Product WHERE this.name LIKE ?1 [1 positional params]
[6/26/24, 9:49:58:186 CDT] 00000055 id=3d2bc4d0 enliberty.data.internal.persistence.service.DBStoreEMBuilder > createEntityManager Entry 
[6/26/24, 9:49:58:186 CDT] 00000055 id=1d8c4485 om.ibm.wsspi.persistence.internal.PersistenceServiceUnitImpl > createEntityManager Entry 
[6/26/24, 9:49:58:186 CDT] 00000055 id=1d8c4485 om.ibm.wsspi.persistence.internal.PersistenceServiceUnitImpl < createEntityManager Exit  
                                                                                                               org.eclipse.persistence.internal.jpa.EntityManagerImpl@46f50a38
[6/26/24, 9:49:58:186 CDT] 00000055 id=3d2bc4d0 enliberty.data.internal.persistence.service.DBStoreEMBuilder < createEntityManager Exit  
                                                                                                               org.eclipse.persistence.internal.jpa.EntityManagerImpl@46f50a38
[6/26/24, 9:49:58:187 CDT] 00000055 id=4c3f8c74 io.openliberty.data.internal.persistence.QueryInfo           > setParameters Entry  
                                                                                                               EJBQueryImpl(DeleteAllQuery(referenceClass=Product sql="DELETE FROM WLPProduct WHERE  LIKE ?"))
                                                                                                               TestFromClauseIdentifiesEntity-%
[6/26/24, 9:49:58:187 CDT] 00000055 id=4c3f8c74 io.openliberty.data.internal.persistence.QueryInfo           3 set ?1 String
[6/26/24, 9:49:58:187 CDT] 00000055 id=4c3f8c74 io.openliberty.data.internal.persistence.QueryInfo           < setParameters Exit 
[6/26/24, 9:49:58:187 CDT] 00000055 id=00000000 eclipselink.ps.connection                                    3 client acquired: 626983658
[6/26/24, 9:49:58:187 CDT] 00000055 id=00000000 eclipselink.ps.transaction                                   3 TX binding to tx mgr, status=STATUS_ACTIVE
[6/26/24, 9:49:58:187 CDT] 00000055 id=00000000 eclipselink.ps.transaction                                   3 acquire unit of work: 168338348
[6/26/24, 9:49:58:187 CDT] 00000055 id=00000000 eclipselink.ps.transaction                                   3 begin unit of work flush
[6/26/24, 9:49:58:187 CDT] 00000055 id=00000000 eclipselink.ps.transaction                                   3 end unit of work flush
[6/26/24, 9:49:58:187 CDT] 00000055 id=00000000 eclipselink.ps.query                                         3 Execute query DeleteAllQuery(referenceClass=Product sql="DELETE FROM WLPProduct WHERE  LIKE ?")
[6/26/24, 9:49:58:187 CDT] 00000055 id=00000000 eclipselink.ps.transaction                                   3 TX beginTransaction, status=STATUS_ACTIVE
[6/26/24, 9:49:58:187 CDT] 00000055 id=00000000 eclipselink.ps.connection                                    3 Connection acquired from connection pool [default].
[6/26/24, 9:49:58:187 CDT] 00000055 id=00000000 eclipselink.ps.connection                                    3 reconnecting to external connection pool
[6/26/24, 9:49:58:187 CDT] 00000055 id=00000000 eclipselink.ps.sql                                           3 DELETE FROM WLPProduct WHERE  LIKE ?
    bind => [1 parameter bound]
[6/26/24, 9:49:58:190 CDT] 00000055 id=00000000 eclipselink.ps.sql                                           3 VALUES(1)
[6/26/24, 9:49:58:190 CDT] 00000055 id=00000000 eclipselink.ps                                               3 CWWKD0291W: Exception [EclipseLink-4002] (Eclipse Persistence Services - 5.0.0-B02.v202404111748): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "LIKE" at line 1, column 31.
Error Code: 20000
Call: DELETE FROM WLPProduct WHERE  LIKE ?
    bind => [1 parameter bound]
Query: DeleteAllQuery(referenceClass=Product sql="DELETE FROM WLPProduct WHERE  LIKE ?")
[6/26/24, 9:49:58:190 CDT] 00000055 id=00000000 eclipselink.ps                                               3 throwable 
                                                                                                               Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 5.0.0-B02.v202404111748): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "LIKE" at line 1, column 31.
Error Code: 20000
Call: DELETE FROM WLPProduct WHERE  LIKE ?
    bind => [1 parameter bound]
Query: DeleteAllQuery(referenceClass=Product sql="DELETE FROM WLPProduct WHERE  LIKE ?")
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:346)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:702)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:569)
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2046)
    at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:322)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:282)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:268)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.deleteAll(DatasourceCallQueryMechanism.java:167)
    at org.eclipse.persistence.queries.DeleteAllQuery.executeDatabaseQuery(DeleteAllQuery.java:210)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:934)
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:833)
    at org.eclipse.persistence.queries.ModifyAllQuery.executeInUnitOfWork(ModifyAllQuery.java:153)
    at org.eclipse.persistence.queries.DeleteAllQuery.executeInUnitOfWork(DeleteAllQuery.java:132)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:3015)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1841)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1823)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1788)
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeUpdate(QueryImpl.java:303)
    at io.openliberty.data.internal.persistence.RepositoryImpl.invoke(RepositoryImpl.java:1083)
    at jdk.proxy14/jdk.proxy14.$Proxy64.destroy(Unknown Source)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:38)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:109)
    at test.jakarta.data.web.MultiRepository$1947407397$Proxy$_$$_WeldClientProxy.destroy(Unknown Source)
    at test.jakarta.data.web.DataTestServlet.testFromClauseIdentifiesEntity(DataTestServlet.java:1663)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at componenttest.app.FATServlet.doGet(FATServlet.java:74)
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:633)
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:723)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1266)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:754)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:451)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1362)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1078)
    at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:77)
    at com.ibm.ws.webcontainer40.servlet.CacheServletWrapper40.handleRequest(CacheServletWrapper40.java:87)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:978)
    at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:293)
    at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:1260)
    at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.wrapHandlerAndExecute(HttpDispatcherLink.java:476)
    at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.ready(HttpDispatcherLink.java:435)
    at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:569)
    at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleNewRequest(HttpInboundLink.java:503)
    at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.processRequest(HttpInboundLink.java:363)
    at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.ready(HttpInboundLink.java:330)
    at com.ibm.ws.tcpchannel.internal.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:169)
    at com.ibm.ws.tcpchannel.internal.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:77)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager.requestComplete(WorkQueueManager.java:516)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager.attemptIO(WorkQueueManager.java:586)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager.workerRun(WorkQueueManager.java:970)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager$Worker.run(WorkQueueManager.java:1059)
    at com.ibm.ws.threading.internal.ExecutorServiceImpl$RunnableWrapper.run(ExecutorServiceImpl.java:280)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
    at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "LIKE" at line 1, column 31.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedPreparedStatement42.<init>(Unknown Source)
    at org.apache.derby.jdbc.Driver42.newEmbedPreparedStatement(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
    at org.apache.derby.iapi.jdbc.BrokeredConnection.prepareStatement(Unknown Source)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2237)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2202)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1751)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1698)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseCall.prepareStatement(DatabaseCall.java:766)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:630)
    ... 55 more
Caused by: ERROR 42X01: Syntax error: Encountered "LIKE" at line 1, column 31.
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.impl.sql.compile.ParserImpl.parseStatementOrSearchCondition(Unknown Source)
    at org.apache.derby.impl.sql.compile.ParserImpl.parseStatement(Unknown Source)
    at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
    at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
    at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source)
    ... 67 more

Additionally, I temporarily added a System.out immediately before invoking EntityManager.createQuery(jpql) to confirm that the JPQL we are sending to it really does include this.name.

Riva-Tholoor-Philip commented 4 days ago

See EclipseLink Issue : 2199