[ 
https://issues.apache.org/jira/browse/OPENJPA-2738?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Robert F. Peake updated OPENJPA-2738:
-------------------------------------
    Description: 
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}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}

 

  was:
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}

 


> 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
>            Priority: Major
>         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}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