Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EclipseLink uses wrong type, String, instead of List of String when retuning a subset of attributes as a record #2342

Open
anija-anil opened this issue Jan 9, 2025 · 0 comments

Comments

@anija-anil
Copy link
Contributor

I attempted to use a Java record,

                String name,
                String romanNumeral,
                ArrayList<String> romanNumeralSymbols) {} 

and the JPQL,

 SELECT NEW test.jakarta.data.web.RomanNumeral(name, romanNumeral, romanNumeralSymbols) FROM Prime WHERE numberId <= ?1 ORDER BY name

to retrieve a subset of attributes of the entity,

<entity class="test.jakarta.data.web.Prime">
  <table name="Prime"/>
  <attributes>
   ...
   <basic name="name">
   </basic>
   <id name="numberId">
    <column nullable="false"/>
   </id>
   <basic name="romanNumeral">
   </basic>
   <element-collection name="romanNumeralSymbols" fetch="EAGER">
   </element-collection>
   ...
  </attributes>
 </entity> 
public class Prime {
    ...
    public String name;
    public long numberId;
    public String romanNumeral;
    public ArrayList<String> romanNumeralSymbols;
    ...

When running the JPQL query, EclipseLink tried to use a single String value equal to the first element of the ArrayList collection as the value of romanNumeralSymbols instead of a value that is the collection, resulting in the error:

< invoke Primes.romanNumeralsLessThanEq Exit  
                                                                                                               Local Exception Stack: 
Exception [EclipseLink-6137] (Eclipse Persistence Services - 5.0.0-B05.v202412161836-e4245e29fa3355029f10c42ea5546c73683dd504): org.eclipse.persistence.exceptions.QueryException
Exception Description: An Exception was thrown while executing a ReportQuery with a constructor expression: java.lang.NoSuchMethodException: test.jakarta.data.web.RomanNumeral.<init>(java.lang.String,java.lang.String,java.lang.String)
Internal Exception: java.lang.NoSuchMethodException: test.jakarta.data.web.RomanNumeral.<init>(java.lang.String,java.lang.String,java.lang.String)
Query: ReportQuery(referenceClass=Prime jpql="SELECT NEW test.jakarta.data.web.RomanNumeral(name, romanNumeral, romanNumeralSymbols) FROM Prime WHERE numberId <= ?1 ORDER BY name")
	at org.eclipse.persistence.exceptions.QueryException.exceptionWhileUsingConstructorExpression(QueryException.java:537)
	at org.eclipse.persistence.queries.ConstructorReportItem.initialize(ConstructorReportItem.java:208)
	at org.eclipse.persistence.queries.ReportQuery.prepare(ReportQuery.java:1153)
	at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:696)
	at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:1031)
	at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:645)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:196)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:120)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:107)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:91)
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1846)
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1869)
	at io.openliberty.data.internal.persistence.RepositoryImpl.invoke(RepositoryImpl.java:734)
	at jdk.proxy14/jdk.proxy14.$Proxy55.romanNumeralsLessThanEq(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.InterceptedProxyMethodHandler.invoke(InterceptedProxyMethodHandler.java:52)
	at test.jakarta.data.web.Primes$Proxy$_$$_WeldInterceptedProxy1.romanNumeralsLessThanEq(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.Primes$1501238887$Proxy$_$$_WeldClientProxy.romanNumeralsLessThanEq(Unknown Source)
	at test.jakarta.data.web.DataTestServlet.testQueryWithRecordResult(DataTestServlet.java:4372)
	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:298)
	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.lang.NoSuchMethodException: test.jakarta.data.web.RomanNumeral.<init>(java.lang.String,java.lang.String,java.lang.String)
	at java.base/java.lang.Class.getConstructor0(Class.java:3761)
	at java.base/java.lang.Class.getConstructor(Class.java:2442)
	at org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getConstructorFor(PrivilegedAccessHelper.java:402)
	at org.eclipse.persistence.queries.ConstructorReportItem.initialize(ConstructorReportItem.java:204)
	... 53 more
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant