Robert F. Peake created OPENJPA-2738:
----------------------------------------

             Summary: Queries using join table fail
                 Key: OPENJPA-2738
                 URL: https://issues.apache.org/jira/browse/OPENJPA-2738
             Project: OpenJPA
          Issue Type: Bug
          Components: criteria, jpa, query, sql
    Affects Versions: 2.4.2
         Environment: Windows 10 Pro (v 1709)
Tomee 7.0.4 (Tomcat 8.5.20)
OpenJPA 2.4.2 (JPA 2.1)
MySQL 5.7
            Reporter: Robert F. Peake
         Attachments: SampleQuery.PNG, image-2018-05-19-12-34-48-475.png

Summary: Programatically, whether using a criteria query, JPQL or native query, 
the child class data contained in the joined table cannot be accessed. However, 
a native query executed in MySQL Workbench does return fields in both the 
parent and child tables.

This problem was posted a month ago on both the OpenJPA Nabble forum:

[+http://openjpa.208410.n2.nabble.com/Criteria-query-ManyToOne-with-join-table-not-working-td7590630.html+]

and Stack Overflow:

[+https://stackoverflow.com/questions/49867134/criteria-query-on-entities-linked-by-a-join-table+]

No solution has been forthcoming.

Organization

The Ledger entity holds the details of a transaction including, optionally, the 
associated Person entity (denominated counterparty) . The Person entity holds a 
List of Ledger entries (denominated transactions) in which that person engaged. 
The entities are linked in a bi-directional relationship using a join table 
(trx_person) containing columns for the pertinent Person.id and Ledger.id. The 
database is MySQL 5.7 and the ORM is OpenJPA 2.4.2 (JPA 2.1) running under 
Tomee 7.0.4 (Tomcat 8.5.20) on Windows 10 Pro (v 1709). Saving a transaction 
writes data to the ledger and person tables and records the respective IDs in 
the trx_person join table. The problem arises when attempting to execute a 
query (whether criteria, JPQL or native) to retrieve data from the parent and 
child tables, resulting in either an error or the failure to retrieve data from 
the child table.
h2. Ledger {color:#000000}Entity{color} (parent):

{color:#646464}@ManyToOne{color}{color:#000000}(fetch = 
FetchType.{color}{color:#0000c0}_*EAGER*_{color}{color:#000000},{color}
 {color:#000000}cascade = 
{CascadeType.{color}{color:#0000c0}_*PERSIST*_{color}{color:#000000}, 
CascadeType.{color}{color:#0000c0}_*MERGE*_{color}{color:#000000}})
 @JoinTable{color:#000000}({color}
 {color:#000000} name = 
{color}{color:#2a00ff}"trx_person"{color}{color:#000000},{color}
 {color:#000000} joinColumns ={color}
 {color:#646464}@JoinColumn{color}{color:#000000}(name = 
{color}{color:#2a00ff}"trx_ID"{color}{color:#000000}, referencedColumnName = 
{color}{color:#2a00ff}"id"{color}{color:#000000}),{color}
 {color:#000000} inverseJoinColumns ={color}
 {color:#646464}@JoinColumn{color}{color:#000000}(name = 
{color}{color:#2a00ff}"person_ID"{color}{color:#000000}, referencedColumnName = 
{color}{color:#2a00ff}"id"{color}{color:#000000}){color}
 {color:#000000}){color}
 {color:#7f0055}*protected*{color}{color:#000000} Person 
{color}{color:#0000c0}counterparty{color}{color:#000000};{color}
h2. {color:#000000}Person Entity{color}

{color:#646464}@OneToMany{color}{color:#000000}(fetch = 
FetchType.{color}{color:#0000c0}_*EAGER*_{color}{color:#000000}, mappedBy = 
{color}{color:#2a00ff}"counterparty"{color}{color:#000000}){color}
 {color:#7f0055}*private*{color}{color:#000000} List<Ledger> 
{color}{color:#0000c0}transactions{color}{color:#000000} = 
{color}{color:#7f0055}*new*{color}{color:#000000} ArrayList<>();{color}
h2. Test Class

{color:#7f0055}*public*{color} {color:#7f0055}*class*{color}{color:#000000} 
LedgerEx {color}{color:#7f0055}*extends*{color}{color:#000000} 
BaseDAOImpl<Ledger, Integer>{color}
 {color:#7f0055}*implements*{color}{color:#000000} Serializable {{color}
  
 {color:#7f0055}*private*{color} {color:#7f0055}*static*{color} 
{color:#7f0055}*final*{color} {color:#7f0055}*long*{color} 
{color:#0000c0}_*serialVersionUID*_{color}{color:#000000} = 1L;{color}

{color:#646464}@SuppressWarnings{color}{color:#000000}({color}{color:#2a00ff}"unchecked"{color}{color:#000000}){color}
 {color:#7f0055}*private*{color}{color:#000000} List<Ledger> execute(Query 
{color}{color:#6a3e3e}theQuery{color}{color:#000000}) {{color}
 {color:#000000} List<Ledger> 
{color}{color:#6a3e3e}results{color}{color:#000000} = 
{color}{color:#7f0055}*null*{color}{color:#000000};{color}
 {color:#000000} String {color}{color:#6a3e3e}qStr{color}{color:#000000} = 
{color}{color:#6a3e3e}theQuery{color}{color:#000000}.unwrap(org.apache.openjpa.persistence.QueryImpl.{color}{color:#7f0055}*class*{color}{color:#000000}).getQueryString();{color}
 
{color:#0000c0}_*LOG*_{color}{color:#000000}.info({color}{color:#2a00ff}"UNWRAPPED
 QUERY: "{color}{color:#000000} + 
{color}{color:#6a3e3e}qStr{color}{color:#000000});{color}
 {color:#7f0055}*try*{color}{color:#000000} {{color}
 {color:#6a3e3e}results{color}{color:#000000} = 
{color}{color:#6a3e3e}theQuery{color}{color:#000000}.getResultList();{color}
 {color:#000000} } {color}{color:#7f0055}*catch*{color}{color:#000000} 
(Exception {color}{color:#6a3e3e}e{color}{color:#000000}) {{color}
 {color:#6a3e3e}e{color}{color:#000000}.printStackTrace();{color}
 {color:#000000} }{color}
 {color:#7f0055}*return*{color} 
{color:#6a3e3e}results{color}{color:#000000};{color}
 {color:#000000} }{color}
  

{color:#7f0055}*public*{color}{color:#000000} List<Ledger> 
retrieveCriteria(String {color}{color:#6a3e3e}lastName{color}{color:#000000}) 
{{color}
 {color:#000000} CriteriaBuilder {color}{color:#6a3e3e}cb{color}{color:#000000} 
= {color}{color:#0000c0}em{color}{color:#000000}.getCriteriaBuilder();{color}
 {color:#000000} CriteriaQuery<Ledger> 
{color}{color:#6a3e3e}q{color}{color:#000000} = 
{color}{color:#6a3e3e}cb{color}{color:#000000}.createQuery(Ledger.{color}{color:#7f0055}*class*{color}{color:#000000});{color}
 {color:#000000} Root<Ledger> 
{color}{color:#6a3e3e}ledger{color}{color:#000000} = 
{color}{color:#6a3e3e}q{color}{color:#000000}.from(Ledger.{color}{color:#7f0055}*class*{color}{color:#000000});{color}
 {color:#000000} Join<Ledger, Person> 
{color}{color:#6a3e3e}person{color}{color:#000000} = 
{color}{color:#6a3e3e}ledger{color}{color:#000000}.join(Ledger_.{color}{color:#0000c0}_counterparty_{color}{color:#000000},
 JoinType.{color}{color:#0000c0}_*LEFT*_{color}{color:#000000});{color}
 {color:#000000} List<Predicate> 
{color}{color:#6a3e3e}predicates{color}{color:#000000} = 
{color}{color:#7f0055}*new*{color}{color:#000000} ArrayList<Predicate>();{color}
 {color:#000000} Path<String> 
{color}{color:#6a3e3e}lnPath{color}{color:#000000} = 
{color}{color:#6a3e3e}person{color}{color:#000000}.get(Person_.{color}{color:#0000c0}_lastName_{color}{color:#000000});{color}
 
{color:#6a3e3e}predicates{color}{color:#000000}.add({color}{color:#6a3e3e}cb{color}{color:#000000}.like({color}{color:#6a3e3e}lnPath{color}{color:#000000},
 {color}{color:#6a3e3e}lastName{color}{color:#000000} + 
{color}{color:#2a00ff}"%"{color}{color:#000000}));{color}
 
{color:#6a3e3e}q{color}{color:#000000}.select({color}{color:#6a3e3e}ledger{color}{color:#000000}).distinct({color}{color:#7f0055}*true*{color}{color:#000000});{color}
 
{color:#6a3e3e}q{color}{color:#000000}.where({color}{color:#6a3e3e}predicates{color}{color:#000000}.toArray({color}{color:#7f0055}*new*{color}{color:#000000}
 
Predicate[{color}{color:#6a3e3e}predicates{color}{color:#000000}.size()]));{color}
 {color:#000000} Query {color}{color:#6a3e3e}theQuery{color}{color:#000000} = 
{color}{color:#0000c0}em{color}{color:#000000}.createQuery({color}{color:#6a3e3e}q{color}{color:#000000});{color}
 
{color:#0000c0}_*LOG*_{color}{color:#000000}.info({color}{color:#2a00ff}"CRITERIA
 QUERY"{color}{color:#000000});{color}
 {color:#7f0055}*return*{color}{color:#000000} 
execute({color}{color:#6a3e3e}theQuery{color}{color:#000000});{color}
 {color:#000000} }{color}

{color:#7f0055}*public*{color}{color:#000000} List<Ledger> retrieveJPQL(String 
{color}{color:#6a3e3e}lastName{color}{color:#000000}) {{color}
 {color:#000000} String {color}{color:#6a3e3e}ln{color}{color:#000000} = 
{color}{color:#6a3e3e}lastName{color}{color:#000000}.trim() + 
{color}{color:#2a00ff}"%"{color}{color:#000000};{color}
 {color:#000000} StringBuilder 
{color}{color:#6a3e3e}selectBldr{color}{color:#000000} = 
{color}{color:#7f0055}*new*{color}{color:#000000} 
StringBuilder({color}{color:#2a00ff}"SELECT l FROM Ledger l 
"{color}{color:#000000});{color}
 
{color:#6a3e3e}selectBldr{color}{color:#000000}.append({color}{color:#2a00ff}"LEFT
 JOIN l.counterparty cp WHERE "{color}{color:#000000}){color}
 {color:#000000}.append({color}{color:#2a00ff}"cp.lastName LIKE 
:lastName"{color}{color:#000000});{color}
 {color:#000000} Query {color}{color:#6a3e3e}theQuery{color}{color:#000000} = 
{color}{color:#7f0055}*null*{color}{color:#000000};{color}
 {color:#000000} String {color}{color:#6a3e3e}qStr{color}{color:#000000} = 
{color}{color:#6a3e3e}selectBldr{color}{color:#000000}.toString();{color}
 {color:#6a3e3e}theQuery{color}{color:#000000} = 
{color}{color:#0000c0}em{color}{color:#000000}.createQuery({color}{color:#6a3e3e}qStr{color}{color:#000000},
 Ledger.{color}{color:#7f0055}*class*{color}{color:#000000});{color}
 
{color:#6a3e3e}theQuery{color}{color:#000000}.setParameter({color}{color:#2a00ff}"lastName"{color}{color:#000000},
 {color}{color:#6a3e3e}ln{color}{color:#000000});{color}
 {color:#0000c0}_*LOG*_{color}{color:#000000}.info({color}{color:#2a00ff}"JPQL 
QUERY"{color}{color:#000000});{color}
 {color:#7f0055}*return*{color}{color:#000000} 
execute({color}{color:#6a3e3e}theQuery{color}{color:#000000});{color}
 {color:#000000} }{color}

{color:#7f0055}*public*{color}{color:#000000} List<Ledger> 
retrieveNative(String {color}{color:#6a3e3e}lastName{color}{color:#000000}) 
{{color}
 {color:#000000} StringBuilder 
{color}{color:#6a3e3e}selectBldr{color}{color:#000000} = 
{color}{color:#7f0055}*new*{color}{color:#000000} 
StringBuilder({color}{color:#2a00ff}"SELECT * FROM Ledger l 
"{color}{color:#000000});{color}
 
{color:#6a3e3e}selectBldr{color}{color:#000000}.append({color}{color:#2a00ff}"LEFT
 OUTER JOIN trx_person tp ON l.id = tp.trx_ID "{color}{color:#000000}){color}
 {color:#000000} .append({color}{color:#2a00ff}"LEFT OUTER JOIN person p ON 
p.id = tp.person_ID"{color}{color:#000000});{color}
 {color:#000000} String {color}{color:#6a3e3e}ln{color}{color:#000000} = 
{color}{color:#6a3e3e}lastName{color}{color:#000000}.trim() + 
{color}{color:#2a00ff}"%"{color}{color:#000000};{color}
 {color:#6a3e3e}selectBldr{color}{color:#000000}.append({color}{color:#2a00ff}" 
WHERE p.last_name LIKE '"{color}{color:#000000} + 
{color}{color:#6a3e3e}ln{color}{color:#000000} + 
{color}{color:#2a00ff}"'"{color}{color:#000000});{color}
 {color:#000000} Query {color}{color:#6a3e3e}theQuery{color}{color:#000000} = 
{color}{color:#7f0055}*null*{color}{color:#000000};{color}
 {color:#000000} String {color}{color:#6a3e3e}qStr{color}{color:#000000} = 
{color}{color:#6a3e3e}selectBldr{color}{color:#000000}.toString();{color}
 {color:#6a3e3e}theQuery{color}{color:#000000} = 
{color}{color:#0000c0}em{color}{color:#000000}.createNativeQuery({color}{color:#6a3e3e}qStr{color}{color:#000000},
 Ledger.{color}{color:#7f0055}*class*{color}{color:#000000});{color}
 
{color:#0000c0}_*LOG*_{color}{color:#000000}.info({color}{color:#2a00ff}"NATIVE 
QUERY"{color}{color:#000000});{color}
 {color:#7f0055}*return*{color}{color:#000000} 
execute({color}{color:#6a3e3e}theQuery{color}{color:#000000});{color}
 {color:#000000} }{color}
h2. Criteria Query:

{color:#ff0000}UNWRAPPED QUERY: SELECT DISTINCT l FROM Ledger l LEFT JOIN 
l.counterparty ? WHERE l.counterparty.lastName LIKE 'bel%'{color}
h2. JPQL:

{color:#ff0000}UNWRAPPED QUERY: SELECT l FROM Ledger l LEFT JOIN l.counterparty 
cp WHERE cp.lastName LIKE :lastName{color}
  

{color:#ff0000}In either case, an NPE is thrown by the 
{color}{color:#000000}join method {color}{color:#000000}of the{color} 
{color:#000000}org.apache.openjpa.jdbc.sql 
{color}{color:#0066cc}+SelectImpl+{color} {color:#000000}class, 
{color}{color:#000000}which is{color}{color:#000000} caused by 
{color}{color:#000000}a{color}{color:#000000} null argument fk 
(ForeignKey):{color}


 <openjpa-2.4.2-r422266:1777108 nonfatal user error> 
{color:#0066cc}+org.apache.openjpa.persistence.ArgumentException+{color}{color:#ff0000}:
 Failed to execute query "SELECT l FROM Ledger l LEFT JOIN l.counterparty cp 
WHERE cp.lastName LIKE :lastName". Check the query syntax for correctness. See 
nested exception for details.{color}
 {color:#ff0000} at 
org.apache.openjpa.kernel.QueryImpl.execute({color}{color:#0066cc}+QueryImpl.java:878+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.kernel.QueryImpl.execute({color}{color:#0066cc}+QueryImpl.java:800+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.kernel.DelegatingQuery.execute({color}{color:#0066cc}+DelegatingQuery.java:541+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.persistence.QueryImpl.execute({color}{color:#0066cc}+QueryImpl.java:274+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.persistence.QueryImpl.getResultList({color}{color:#0066cc}+QueryImpl.java:290+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
rfpeake.scc.persistence.LedgerEx.retrieveJPQL({color}{color:#0066cc}+LedgerEx.java:78+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
rfpeake.scc.view.JournalView.test({color}{color:#0066cc}+JournalView.java:921+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
rfpeake.scc.view.JournalView$$OwbInterceptProxy0.test(rfpeake/scc/view/JournalView.java){color}
 {color:#ff0000} at 
rfpeake.scc.view.JournalView$$OwbNormalScopeProxy0.test(rfpeake/scc/view/JournalView.java){color}
 {color:#ff0000} at 
sun.reflect.NativeMethodAccessorImpl.invoke0({color}{color:#0066cc}+Native 
Method+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
sun.reflect.NativeMethodAccessorImpl.invoke({color}{color:#0066cc}+NativeMethodAccessorImpl.java:62+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
sun.reflect.DelegatingMethodAccessorImpl.invoke({color}{color:#0066cc}+DelegatingMethodAccessorImpl.java:43+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
java.lang.reflect.Method.invoke({color}{color:#0066cc}+Method.java:498+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.el.parser.AstValue.invoke({color}{color:#0066cc}+AstValue.java:247+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.el.MethodExpressionImpl.invoke({color}{color:#0066cc}+MethodExpressionImpl.java:267+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.webbeans.el22.WrappedMethodExpression.invoke({color}{color:#0066cc}+WrappedMethodExpression.java:52+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.webbeans.el22.WrappedMethodExpression.invoke({color}{color:#0066cc}+WrappedMethodExpression.java:52+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.myfaces.view.facelets.el.ContextAwareTagMethodExpression.invoke({color}{color:#0066cc}+ContextAwareTagMethodExpression.java:96+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.myfaces.application.ActionListenerImpl.processAction({color}{color:#0066cc}+ActionListenerImpl.java:74+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
javax.faces.component.UICommand.broadcast({color}{color:#0066cc}+UICommand.java:120+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
javax.faces.component.UIViewRoot._broadcastAll({color}{color:#0066cc}+UIViewRoot.java:1174+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
javax.faces.component.UIViewRoot.broadcastEvents({color}{color:#0066cc}+UIViewRoot.java:365+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
javax.faces.component.UIViewRoot._process({color}{color:#0066cc}+UIViewRoot.java:1660+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
javax.faces.component.UIViewRoot.processApplication({color}{color:#0066cc}+UIViewRoot.java:864+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute({color}{color:#0066cc}+InvokeApplicationExecutor.java:42+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase({color}{color:#0066cc}+LifecycleImpl.java:196+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.myfaces.lifecycle.LifecycleImpl.execute({color}{color:#0066cc}+LifecycleImpl.java:143+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
javax.faces.webapp.FacesServlet.service({color}{color:#0066cc}+FacesServlet.java:198+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter({color}{color:#0066cc}+ApplicationFilterChain.java:231+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.core.ApplicationFilterChain.doFilter({color}{color:#0066cc}+ApplicationFilterChain.java:166+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.tomcat.websocket.server.WsFilter.doFilter({color}{color:#0066cc}+WsFilter.java:52+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter({color}{color:#0066cc}+ApplicationFilterChain.java:193+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.core.ApplicationFilterChain.doFilter({color}{color:#0066cc}+ApplicationFilterChain.java:166+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openejb.server.httpd.EEFilter.doFilter({color}{color:#0066cc}+EEFilter.java:65+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter({color}{color:#0066cc}+ApplicationFilterChain.java:193+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.core.ApplicationFilterChain.doFilter({color}{color:#0066cc}+ApplicationFilterChain.java:166+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.core.StandardWrapperValve.invoke({color}{color:#0066cc}+StandardWrapperValve.java:198+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.core.StandardContextValve.invoke({color}{color:#0066cc}+StandardContextValve.java:96+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.tomee.catalina.OpenEJBValve.invoke({color}{color:#0066cc}+OpenEJBValve.java:44+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.authenticator.AuthenticatorBase.invoke({color}{color:#0066cc}+AuthenticatorBase.java:478+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.core.StandardHostValve.invoke({color}{color:#0066cc}+StandardHostValve.java:140+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.valves.ErrorReportValve.invoke({color}{color:#0066cc}+ErrorReportValve.java:80+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke({color}{color:#0066cc}+OpenEJBSecurityListener.java:97+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.valves.AbstractAccessLogValve.invoke({color}{color:#0066cc}+AbstractAccessLogValve.java:650+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.core.StandardEngineValve.invoke({color}{color:#0066cc}+StandardEngineValve.java:87+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.catalina.connector.CoyoteAdapter.service({color}{color:#0066cc}+CoyoteAdapter.java:342+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.coyote.http11.Http11Processor.service({color}{color:#0066cc}+Http11Processor.java:799+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.coyote.AbstractProcessorLight.process({color}{color:#0066cc}+AbstractProcessorLight.java:66+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.coyote.AbstractProtocol$ConnectionHandler.process({color}{color:#0066cc}+AbstractProtocol.java:868+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun({color}{color:#0066cc}+NioEndpoint.java:1457+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.tomcat.util.net.SocketProcessorBase.run({color}{color:#0066cc}+SocketProcessorBase.java:49+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
java.util.concurrent.ThreadPoolExecutor.runWorker({color}{color:#0066cc}+ThreadPoolExecutor.java:1142+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
java.util.concurrent.ThreadPoolExecutor$Worker.run({color}{color:#0066cc}+ThreadPoolExecutor.java:617+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run({color}{color:#0066cc}+TaskThread.java:61+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
java.lang.Thread.run({color}{color:#0066cc}+Thread.java:745+{color}{color:#ff0000}){color}
 {color:#ff0000}Caused by: 
{color}{color:#0066cc}+java.lang.NullPointerException+ {color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.sql.SelectImpl$SelectJoins.join({color}{color:#0066cc}+SelectImpl.java:2981+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.sql.SelectImpl$SelectJoins.outerJoinRelation({color}{color:#0066cc}+SelectImpl.java:2961+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy.joinRelation({color}{color:#0066cc}+RelationFieldStrategy.java:939+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.meta.FieldMapping.joinRelation({color}{color:#0066cc}+FieldMapping.java:985+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.kernel.exps.PCPath.joinRelation({color}{color:#0066cc}+PCPath.java:826+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.kernel.exps.PCPath.initialize({color}{color:#0066cc}+PCPath.java:644+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.kernel.exps.Variable.initialize({color}{color:#0066cc}+Variable.java:119+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.kernel.exps.BindVariableExpression.initialize({color}{color:#0066cc}+BindVariableExpression.java:58+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.kernel.exps.BindVariableAndExpression.initialize({color}{color:#0066cc}+BindVariableAndExpression.java:47+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.initialize({color}{color:#0066cc}+SelectConstructor.java:231+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.newSelect({color}{color:#0066cc}+SelectConstructor.java:172+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.evaluate({color}{color:#0066cc}+SelectConstructor.java:86+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.createWhereSelects({color}{color:#0066cc}+JDBCStoreQuery.java:359+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.executeQuery({color}{color:#0066cc}+JDBCStoreQuery.java:192+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.executeQuery({color}{color:#0066cc}+ExpressionStoreQuery.java:783+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.kernel.QueryImpl.execute({color}{color:#0066cc}+QueryImpl.java:1011+{color}{color:#ff0000}){color}
 {color:#ff0000} at 
org.apache.openjpa.kernel.QueryImpl.execute({color}{color:#0066cc}+QueryImpl.java:869+{color}{color:#ff0000}){color}
 {color:#ff0000} ... 54 more{color}
h2. Here is the subject method:

{color:#7f0055}*package*{color}{color:#000000} 
org.apache.openjpa.jdbc.sql;{color}
 {color:#7f0055}*public*{color} {color:#7f0055}*class*{color}{color:#000000} 
SelectImpl{color}

{color:#7f0055}*private*{color}{color:#000000} Joins join(String 
{color}{color:#6a3e3e}name{color}{color:#000000}, ForeignKey 
{color}{color:#6a3e3e}fk{color}{color:#000000}, ClassMapping 
{color}{color:#6a3e3e}target{color}{color:#000000},{color}
 {color:#7f0055}*int*{color} {color:#6a3e3e}subs{color}{color:#000000}, 
{color}{color:#7f0055}*boolean*{color} 
{color:#6a3e3e}inverse{color}{color:#000000}, 
{color}{color:#7f0055}*boolean*{color} 
{color:#6a3e3e}toMany{color}{color:#000000}, 
{color}{color:#7f0055}*boolean*{color} 
{color:#6a3e3e}outer{color}{color:#000000}) {{color}
 {color:#ff0000}. . .{color} 
 {color:#7f0055}*if*{color}{color:#000000} 
({color}{color:#6a3e3e}createJoin{color}{color:#000000}) {{color}
 {color:#7f0055}*boolean*{color} 
{color:#6a3e3e}createIndex{color}{color:#000000} = 
{color}{color:#7f0055}*true*{color}{color:#000000};{color}
 {color:#6a3e3e}table1{color}{color:#000000} = 
({color}{color:#6a3e3e}inverse{color}{color:#000000}) ? 
{color}{color:#6a3e3e}fk{color}{color:#000000}.getPrimaryKeyTable() : 
{color}{color:#6a3e3e}fk{color}{color:#000000}.getTable(); //{color} 
{color:#000000}NPE{color}
 {color:#7f0055}*if*{color}{color:#000000} 
({color}{color:#0000c0}correlatedVar{color}{color:#000000} != 
{color}{color:#7f0055}*null*{color}{color:#000000}){color}
 {color:#6a3e3e}createIndex{color}{color:#000000} = 
{color}{color:#7f0055}*false*{color}{color:#000000}; {color}{color:#3f7f5f}// 
not to create here{color}
 {color:#6a3e3e}alias1{color}{color:#000000} = 
{color}{color:#0000c0}_sel{color}{color:#000000}.getTableIndex({color}{color:#6a3e3e}table1{color}{color:#000000},
 {color}{color:#7f0055}*this*{color}{color:#000000}, 
{color}{color:#6a3e3e}createIndex{color}{color:#000000});{color}
 }
h2. Native Query:

{color:#ff0000}UNWRAPPED QUERY: SELECT * FROM Ledger l LEFT OUTER JOIN 
trx_person tp ON l.id = tp.trx_ID LEFT OUTER JOIN person p ON p.id = 
tp.person_ID WHERE p.last_name LIKE 'bel%'{color} 

{color:#ff0000}26473 sccPU TRACE [http-nio-8080-exec-1] openjpa.jdbc.SQL - <t 
2001566939, conn 1897759772> executing prepstmnt 92722447 {color}
 {color:#ff0000}SELECT * {color}
 {color:#ff0000} FROM Ledger l LEFT OUTER JOIN trx_person tp ON l.id = 
tp.trx_ID LEFT {color}
 {color:#ff0000} OUTER JOIN person p ON p.id = tp.person_ID {color}
 {color:#ff0000} WHERE p.last_name LIKE 'bel%' {color}

{color:#ff0000}26478 sccPU TRACE [http-nio-8080-exec-1] openjpa.jdbc.SQL - <t 
2001566939, conn 1897759772> [5 ms] spent{color}
 {color:#ff0000}May 17, 2018 1:51:47 PM rfpeake.scc.view.JournalView 
processTrxList{color}
 {color:#ff0000}INFO: resultCount = 5{color}
 {color:#ff0000}May 17, 2018 1:51:47 PM rfpeake.scc.view.JournalView 
display{color}
 {color:#ff0000}WARNING: ledger.counterparty is null{color}

While no error is thrown, the Person entity 
({color:#ff0000}ledger.counterparty{color}) is not returned. {color:#000000}It 
seems that{color} {color:#000000}the join table annotations are detected upon 
writing data, {color}{color:#000000}but {color}{color:#000000}the 
{color}{color:#000000}join table information is{color} {color:#000000}not 
utiliz{color}{color:#000000}ed when querying data. 
{color}{color:#000000}Executing the query in MySQL Workbench returns data from 
both tables {color}{color:#000000}and will return all columns using: SELECT * 
FROM ledger l.{color}

{color:#000000}See screenshot attached.{color}

 

{color:#000000} {color}

 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to