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 #30501

Open
njr-11 opened this issue Jan 8, 2025 · 1 comment

Comments

@njr-11
Copy link
Contributor

njr-11 commented Jan 8, 2025

I attempted to use a Java record,

public record RomanNumeral(
                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
@anija-anil
Copy link
Contributor

See EL Issue : 2342

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants