[
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)