Robert F. Peake created OPENJPA-2738:
----------------------------------------
Summary: Queries using join table fail
Key: OPENJPA-2738
URL: https://issues.apache.org/jira/browse/OPENJPA-2738
Project: OpenJPA
Issue Type: Bug
Components: criteria, jpa, query, sql
Affects Versions: 2.4.2
Environment: Windows 10 Pro (v 1709)
Tomee 7.0.4 (Tomcat 8.5.20)
OpenJPA 2.4.2 (JPA 2.1)
MySQL 5.7
Reporter: Robert F. Peake
Attachments: SampleQuery.PNG, image-2018-05-19-12-34-48-475.png
Summary: Programatically, whether using a criteria query, JPQL or native query,
the child class data contained in the joined table cannot be accessed. However,
a native query executed in MySQL Workbench does return fields in both the
parent and child tables.
This problem was posted a month ago on both the OpenJPA Nabble forum:
[+http://openjpa.208410.n2.nabble.com/Criteria-query-ManyToOne-with-join-table-not-working-td7590630.html+]
and Stack Overflow:
[+https://stackoverflow.com/questions/49867134/criteria-query-on-entities-linked-by-a-join-table+]
No solution has been forthcoming.
Organization
The Ledger entity holds the details of a transaction including, optionally, the
associated Person entity (denominated counterparty) . The Person entity holds a
List of Ledger entries (denominated transactions) in which that person engaged.
The entities are linked in a bi-directional relationship using a join table
(trx_person) containing columns for the pertinent Person.id and Ledger.id. The
database is MySQL 5.7 and the ORM is OpenJPA 2.4.2 (JPA 2.1) running under
Tomee 7.0.4 (Tomcat 8.5.20) on Windows 10 Pro (v 1709). Saving a transaction
writes data to the ledger and person tables and records the respective IDs in
the trx_person join table. The problem arises when attempting to execute a
query (whether criteria, JPQL or native) to retrieve data from the parent and
child tables, resulting in either an error or the failure to retrieve data from
the child table.
h2. Ledger {color:#000000}Entity{color} (parent):
{color:#646464}@ManyToOne{color}{color:#000000}(fetch =
FetchType.{color}{color:#0000c0}_*EAGER*_{color}{color:#000000},{color}
{color:#000000}cascade =
{CascadeType.{color}{color:#0000c0}_*PERSIST*_{color}{color:#000000},
CascadeType.{color}{color:#0000c0}_*MERGE*_{color}{color:#000000}})
@JoinTable{color:#000000}({color}
{color:#000000} name =
{color}{color:#2a00ff}"trx_person"{color}{color:#000000},{color}
{color:#000000} joinColumns ={color}
{color:#646464}@JoinColumn{color}{color:#000000}(name =
{color}{color:#2a00ff}"trx_ID"{color}{color:#000000}, referencedColumnName =
{color}{color:#2a00ff}"id"{color}{color:#000000}),{color}
{color:#000000} inverseJoinColumns ={color}
{color:#646464}@JoinColumn{color}{color:#000000}(name =
{color}{color:#2a00ff}"person_ID"{color}{color:#000000}, referencedColumnName =
{color}{color:#2a00ff}"id"{color}{color:#000000}){color}
{color:#000000}){color}
{color:#7f0055}*protected*{color}{color:#000000} Person
{color}{color:#0000c0}counterparty{color}{color:#000000};{color}
h2. {color:#000000}Person Entity{color}
{color:#646464}@OneToMany{color}{color:#000000}(fetch =
FetchType.{color}{color:#0000c0}_*EAGER*_{color}{color:#000000}, mappedBy =
{color}{color:#2a00ff}"counterparty"{color}{color:#000000}){color}
{color:#7f0055}*private*{color}{color:#000000} List<Ledger>
{color}{color:#0000c0}transactions{color}{color:#000000} =
{color}{color:#7f0055}*new*{color}{color:#000000} ArrayList<>();{color}
h2. Test Class
{color:#7f0055}*public*{color} {color:#7f0055}*class*{color}{color:#000000}
LedgerEx {color}{color:#7f0055}*extends*{color}{color:#000000}
BaseDAOImpl<Ledger, Integer>{color}
{color:#7f0055}*implements*{color}{color:#000000} Serializable {{color}
{color:#7f0055}*private*{color} {color:#7f0055}*static*{color}
{color:#7f0055}*final*{color} {color:#7f0055}*long*{color}
{color:#0000c0}_*serialVersionUID*_{color}{color:#000000} = 1L;{color}
{color:#646464}@SuppressWarnings{color}{color:#000000}({color}{color:#2a00ff}"unchecked"{color}{color:#000000}){color}
{color:#7f0055}*private*{color}{color:#000000} List<Ledger> execute(Query
{color}{color:#6a3e3e}theQuery{color}{color:#000000}) {{color}
{color:#000000} List<Ledger>
{color}{color:#6a3e3e}results{color}{color:#000000} =
{color}{color:#7f0055}*null*{color}{color:#000000};{color}
{color:#000000} String {color}{color:#6a3e3e}qStr{color}{color:#000000} =
{color}{color:#6a3e3e}theQuery{color}{color:#000000}.unwrap(org.apache.openjpa.persistence.QueryImpl.{color}{color:#7f0055}*class*{color}{color:#000000}).getQueryString();{color}
{color:#0000c0}_*LOG*_{color}{color:#000000}.info({color}{color:#2a00ff}"UNWRAPPED
QUERY: "{color}{color:#000000} +
{color}{color:#6a3e3e}qStr{color}{color:#000000});{color}
{color:#7f0055}*try*{color}{color:#000000} {{color}
{color:#6a3e3e}results{color}{color:#000000} =
{color}{color:#6a3e3e}theQuery{color}{color:#000000}.getResultList();{color}
{color:#000000} } {color}{color:#7f0055}*catch*{color}{color:#000000}
(Exception {color}{color:#6a3e3e}e{color}{color:#000000}) {{color}
{color:#6a3e3e}e{color}{color:#000000}.printStackTrace();{color}
{color:#000000} }{color}
{color:#7f0055}*return*{color}
{color:#6a3e3e}results{color}{color:#000000};{color}
{color:#000000} }{color}
{color:#7f0055}*public*{color}{color:#000000} List<Ledger>
retrieveCriteria(String {color}{color:#6a3e3e}lastName{color}{color:#000000})
{{color}
{color:#000000} CriteriaBuilder {color}{color:#6a3e3e}cb{color}{color:#000000}
= {color}{color:#0000c0}em{color}{color:#000000}.getCriteriaBuilder();{color}
{color:#000000} CriteriaQuery<Ledger>
{color}{color:#6a3e3e}q{color}{color:#000000} =
{color}{color:#6a3e3e}cb{color}{color:#000000}.createQuery(Ledger.{color}{color:#7f0055}*class*{color}{color:#000000});{color}
{color:#000000} Root<Ledger>
{color}{color:#6a3e3e}ledger{color}{color:#000000} =
{color}{color:#6a3e3e}q{color}{color:#000000}.from(Ledger.{color}{color:#7f0055}*class*{color}{color:#000000});{color}
{color:#000000} Join<Ledger, Person>
{color}{color:#6a3e3e}person{color}{color:#000000} =
{color}{color:#6a3e3e}ledger{color}{color:#000000}.join(Ledger_.{color}{color:#0000c0}_counterparty_{color}{color:#000000},
JoinType.{color}{color:#0000c0}_*LEFT*_{color}{color:#000000});{color}
{color:#000000} List<Predicate>
{color}{color:#6a3e3e}predicates{color}{color:#000000} =
{color}{color:#7f0055}*new*{color}{color:#000000} ArrayList<Predicate>();{color}
{color:#000000} Path<String>
{color}{color:#6a3e3e}lnPath{color}{color:#000000} =
{color}{color:#6a3e3e}person{color}{color:#000000}.get(Person_.{color}{color:#0000c0}_lastName_{color}{color:#000000});{color}
{color:#6a3e3e}predicates{color}{color:#000000}.add({color}{color:#6a3e3e}cb{color}{color:#000000}.like({color}{color:#6a3e3e}lnPath{color}{color:#000000},
{color}{color:#6a3e3e}lastName{color}{color:#000000} +
{color}{color:#2a00ff}"%"{color}{color:#000000}));{color}
{color:#6a3e3e}q{color}{color:#000000}.select({color}{color:#6a3e3e}ledger{color}{color:#000000}).distinct({color}{color:#7f0055}*true*{color}{color:#000000});{color}
{color:#6a3e3e}q{color}{color:#000000}.where({color}{color:#6a3e3e}predicates{color}{color:#000000}.toArray({color}{color:#7f0055}*new*{color}{color:#000000}
Predicate[{color}{color:#6a3e3e}predicates{color}{color:#000000}.size()]));{color}
{color:#000000} Query {color}{color:#6a3e3e}theQuery{color}{color:#000000} =
{color}{color:#0000c0}em{color}{color:#000000}.createQuery({color}{color:#6a3e3e}q{color}{color:#000000});{color}
{color:#0000c0}_*LOG*_{color}{color:#000000}.info({color}{color:#2a00ff}"CRITERIA
QUERY"{color}{color:#000000});{color}
{color:#7f0055}*return*{color}{color:#000000}
execute({color}{color:#6a3e3e}theQuery{color}{color:#000000});{color}
{color:#000000} }{color}
{color:#7f0055}*public*{color}{color:#000000} List<Ledger> retrieveJPQL(String
{color}{color:#6a3e3e}lastName{color}{color:#000000}) {{color}
{color:#000000} String {color}{color:#6a3e3e}ln{color}{color:#000000} =
{color}{color:#6a3e3e}lastName{color}{color:#000000}.trim() +
{color}{color:#2a00ff}"%"{color}{color:#000000};{color}
{color:#000000} StringBuilder
{color}{color:#6a3e3e}selectBldr{color}{color:#000000} =
{color}{color:#7f0055}*new*{color}{color:#000000}
StringBuilder({color}{color:#2a00ff}"SELECT l FROM Ledger l
"{color}{color:#000000});{color}
{color:#6a3e3e}selectBldr{color}{color:#000000}.append({color}{color:#2a00ff}"LEFT
JOIN l.counterparty cp WHERE "{color}{color:#000000}){color}
{color:#000000}.append({color}{color:#2a00ff}"cp.lastName LIKE
:lastName"{color}{color:#000000});{color}
{color:#000000} Query {color}{color:#6a3e3e}theQuery{color}{color:#000000} =
{color}{color:#7f0055}*null*{color}{color:#000000};{color}
{color:#000000} String {color}{color:#6a3e3e}qStr{color}{color:#000000} =
{color}{color:#6a3e3e}selectBldr{color}{color:#000000}.toString();{color}
{color:#6a3e3e}theQuery{color}{color:#000000} =
{color}{color:#0000c0}em{color}{color:#000000}.createQuery({color}{color:#6a3e3e}qStr{color}{color:#000000},
Ledger.{color}{color:#7f0055}*class*{color}{color:#000000});{color}
{color:#6a3e3e}theQuery{color}{color:#000000}.setParameter({color}{color:#2a00ff}"lastName"{color}{color:#000000},
{color}{color:#6a3e3e}ln{color}{color:#000000});{color}
{color:#0000c0}_*LOG*_{color}{color:#000000}.info({color}{color:#2a00ff}"JPQL
QUERY"{color}{color:#000000});{color}
{color:#7f0055}*return*{color}{color:#000000}
execute({color}{color:#6a3e3e}theQuery{color}{color:#000000});{color}
{color:#000000} }{color}
{color:#7f0055}*public*{color}{color:#000000} List<Ledger>
retrieveNative(String {color}{color:#6a3e3e}lastName{color}{color:#000000})
{{color}
{color:#000000} StringBuilder
{color}{color:#6a3e3e}selectBldr{color}{color:#000000} =
{color}{color:#7f0055}*new*{color}{color:#000000}
StringBuilder({color}{color:#2a00ff}"SELECT * FROM Ledger l
"{color}{color:#000000});{color}
{color:#6a3e3e}selectBldr{color}{color:#000000}.append({color}{color:#2a00ff}"LEFT
OUTER JOIN trx_person tp ON l.id = tp.trx_ID "{color}{color:#000000}){color}
{color:#000000} .append({color}{color:#2a00ff}"LEFT OUTER JOIN person p ON
p.id = tp.person_ID"{color}{color:#000000});{color}
{color:#000000} String {color}{color:#6a3e3e}ln{color}{color:#000000} =
{color}{color:#6a3e3e}lastName{color}{color:#000000}.trim() +
{color}{color:#2a00ff}"%"{color}{color:#000000};{color}
{color:#6a3e3e}selectBldr{color}{color:#000000}.append({color}{color:#2a00ff}"
WHERE p.last_name LIKE '"{color}{color:#000000} +
{color}{color:#6a3e3e}ln{color}{color:#000000} +
{color}{color:#2a00ff}"'"{color}{color:#000000});{color}
{color:#000000} Query {color}{color:#6a3e3e}theQuery{color}{color:#000000} =
{color}{color:#7f0055}*null*{color}{color:#000000};{color}
{color:#000000} String {color}{color:#6a3e3e}qStr{color}{color:#000000} =
{color}{color:#6a3e3e}selectBldr{color}{color:#000000}.toString();{color}
{color:#6a3e3e}theQuery{color}{color:#000000} =
{color}{color:#0000c0}em{color}{color:#000000}.createNativeQuery({color}{color:#6a3e3e}qStr{color}{color:#000000},
Ledger.{color}{color:#7f0055}*class*{color}{color:#000000});{color}
{color:#0000c0}_*LOG*_{color}{color:#000000}.info({color}{color:#2a00ff}"NATIVE
QUERY"{color}{color:#000000});{color}
{color:#7f0055}*return*{color}{color:#000000}
execute({color}{color:#6a3e3e}theQuery{color}{color:#000000});{color}
{color:#000000} }{color}
h2. Criteria Query:
{color:#ff0000}UNWRAPPED QUERY: SELECT DISTINCT l FROM Ledger l LEFT JOIN
l.counterparty ? WHERE l.counterparty.lastName LIKE 'bel%'{color}
h2. JPQL:
{color:#ff0000}UNWRAPPED QUERY: SELECT l FROM Ledger l LEFT JOIN l.counterparty
cp WHERE cp.lastName LIKE :lastName{color}
{color:#ff0000}In either case, an NPE is thrown by the
{color}{color:#000000}join method {color}{color:#000000}of the{color}
{color:#000000}org.apache.openjpa.jdbc.sql
{color}{color:#0066cc}+SelectImpl+{color} {color:#000000}class,
{color}{color:#000000}which is{color}{color:#000000} caused by
{color}{color:#000000}a{color}{color:#000000} null argument fk
(ForeignKey):{color}
<openjpa-2.4.2-r422266:1777108 nonfatal user error>
{color:#0066cc}+org.apache.openjpa.persistence.ArgumentException+{color}{color:#ff0000}:
Failed to execute query "SELECT l FROM Ledger l LEFT JOIN l.counterparty cp
WHERE cp.lastName LIKE :lastName". Check the query syntax for correctness. See
nested exception for details.{color}
{color:#ff0000} at
org.apache.openjpa.kernel.QueryImpl.execute({color}{color:#0066cc}+QueryImpl.java:878+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.kernel.QueryImpl.execute({color}{color:#0066cc}+QueryImpl.java:800+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.kernel.DelegatingQuery.execute({color}{color:#0066cc}+DelegatingQuery.java:541+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.persistence.QueryImpl.execute({color}{color:#0066cc}+QueryImpl.java:274+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.persistence.QueryImpl.getResultList({color}{color:#0066cc}+QueryImpl.java:290+{color}{color:#ff0000}){color}
{color:#ff0000} at
rfpeake.scc.persistence.LedgerEx.retrieveJPQL({color}{color:#0066cc}+LedgerEx.java:78+{color}{color:#ff0000}){color}
{color:#ff0000} at
rfpeake.scc.view.JournalView.test({color}{color:#0066cc}+JournalView.java:921+{color}{color:#ff0000}){color}
{color:#ff0000} at
rfpeake.scc.view.JournalView$$OwbInterceptProxy0.test(rfpeake/scc/view/JournalView.java){color}
{color:#ff0000} at
rfpeake.scc.view.JournalView$$OwbNormalScopeProxy0.test(rfpeake/scc/view/JournalView.java){color}
{color:#ff0000} at
sun.reflect.NativeMethodAccessorImpl.invoke0({color}{color:#0066cc}+Native
Method+{color}{color:#ff0000}){color}
{color:#ff0000} at
sun.reflect.NativeMethodAccessorImpl.invoke({color}{color:#0066cc}+NativeMethodAccessorImpl.java:62+{color}{color:#ff0000}){color}
{color:#ff0000} at
sun.reflect.DelegatingMethodAccessorImpl.invoke({color}{color:#0066cc}+DelegatingMethodAccessorImpl.java:43+{color}{color:#ff0000}){color}
{color:#ff0000} at
java.lang.reflect.Method.invoke({color}{color:#0066cc}+Method.java:498+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.el.parser.AstValue.invoke({color}{color:#0066cc}+AstValue.java:247+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.el.MethodExpressionImpl.invoke({color}{color:#0066cc}+MethodExpressionImpl.java:267+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.webbeans.el22.WrappedMethodExpression.invoke({color}{color:#0066cc}+WrappedMethodExpression.java:52+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.webbeans.el22.WrappedMethodExpression.invoke({color}{color:#0066cc}+WrappedMethodExpression.java:52+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.myfaces.view.facelets.el.ContextAwareTagMethodExpression.invoke({color}{color:#0066cc}+ContextAwareTagMethodExpression.java:96+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.myfaces.application.ActionListenerImpl.processAction({color}{color:#0066cc}+ActionListenerImpl.java:74+{color}{color:#ff0000}){color}
{color:#ff0000} at
javax.faces.component.UICommand.broadcast({color}{color:#0066cc}+UICommand.java:120+{color}{color:#ff0000}){color}
{color:#ff0000} at
javax.faces.component.UIViewRoot._broadcastAll({color}{color:#0066cc}+UIViewRoot.java:1174+{color}{color:#ff0000}){color}
{color:#ff0000} at
javax.faces.component.UIViewRoot.broadcastEvents({color}{color:#0066cc}+UIViewRoot.java:365+{color}{color:#ff0000}){color}
{color:#ff0000} at
javax.faces.component.UIViewRoot._process({color}{color:#0066cc}+UIViewRoot.java:1660+{color}{color:#ff0000}){color}
{color:#ff0000} at
javax.faces.component.UIViewRoot.processApplication({color}{color:#0066cc}+UIViewRoot.java:864+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute({color}{color:#0066cc}+InvokeApplicationExecutor.java:42+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase({color}{color:#0066cc}+LifecycleImpl.java:196+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.myfaces.lifecycle.LifecycleImpl.execute({color}{color:#0066cc}+LifecycleImpl.java:143+{color}{color:#ff0000}){color}
{color:#ff0000} at
javax.faces.webapp.FacesServlet.service({color}{color:#0066cc}+FacesServlet.java:198+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter({color}{color:#0066cc}+ApplicationFilterChain.java:231+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.core.ApplicationFilterChain.doFilter({color}{color:#0066cc}+ApplicationFilterChain.java:166+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.tomcat.websocket.server.WsFilter.doFilter({color}{color:#0066cc}+WsFilter.java:52+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter({color}{color:#0066cc}+ApplicationFilterChain.java:193+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.core.ApplicationFilterChain.doFilter({color}{color:#0066cc}+ApplicationFilterChain.java:166+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openejb.server.httpd.EEFilter.doFilter({color}{color:#0066cc}+EEFilter.java:65+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter({color}{color:#0066cc}+ApplicationFilterChain.java:193+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.core.ApplicationFilterChain.doFilter({color}{color:#0066cc}+ApplicationFilterChain.java:166+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.core.StandardWrapperValve.invoke({color}{color:#0066cc}+StandardWrapperValve.java:198+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.core.StandardContextValve.invoke({color}{color:#0066cc}+StandardContextValve.java:96+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.tomee.catalina.OpenEJBValve.invoke({color}{color:#0066cc}+OpenEJBValve.java:44+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.authenticator.AuthenticatorBase.invoke({color}{color:#0066cc}+AuthenticatorBase.java:478+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.core.StandardHostValve.invoke({color}{color:#0066cc}+StandardHostValve.java:140+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.valves.ErrorReportValve.invoke({color}{color:#0066cc}+ErrorReportValve.java:80+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke({color}{color:#0066cc}+OpenEJBSecurityListener.java:97+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.valves.AbstractAccessLogValve.invoke({color}{color:#0066cc}+AbstractAccessLogValve.java:650+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.core.StandardEngineValve.invoke({color}{color:#0066cc}+StandardEngineValve.java:87+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.catalina.connector.CoyoteAdapter.service({color}{color:#0066cc}+CoyoteAdapter.java:342+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.coyote.http11.Http11Processor.service({color}{color:#0066cc}+Http11Processor.java:799+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.coyote.AbstractProcessorLight.process({color}{color:#0066cc}+AbstractProcessorLight.java:66+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.coyote.AbstractProtocol$ConnectionHandler.process({color}{color:#0066cc}+AbstractProtocol.java:868+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun({color}{color:#0066cc}+NioEndpoint.java:1457+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.tomcat.util.net.SocketProcessorBase.run({color}{color:#0066cc}+SocketProcessorBase.java:49+{color}{color:#ff0000}){color}
{color:#ff0000} at
java.util.concurrent.ThreadPoolExecutor.runWorker({color}{color:#0066cc}+ThreadPoolExecutor.java:1142+{color}{color:#ff0000}){color}
{color:#ff0000} at
java.util.concurrent.ThreadPoolExecutor$Worker.run({color}{color:#0066cc}+ThreadPoolExecutor.java:617+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run({color}{color:#0066cc}+TaskThread.java:61+{color}{color:#ff0000}){color}
{color:#ff0000} at
java.lang.Thread.run({color}{color:#0066cc}+Thread.java:745+{color}{color:#ff0000}){color}
{color:#ff0000}Caused by:
{color}{color:#0066cc}+java.lang.NullPointerException+ {color}
{color:#ff0000} at
org.apache.openjpa.jdbc.sql.SelectImpl$SelectJoins.join({color}{color:#0066cc}+SelectImpl.java:2981+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.sql.SelectImpl$SelectJoins.outerJoinRelation({color}{color:#0066cc}+SelectImpl.java:2961+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy.joinRelation({color}{color:#0066cc}+RelationFieldStrategy.java:939+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.meta.FieldMapping.joinRelation({color}{color:#0066cc}+FieldMapping.java:985+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.kernel.exps.PCPath.joinRelation({color}{color:#0066cc}+PCPath.java:826+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.kernel.exps.PCPath.initialize({color}{color:#0066cc}+PCPath.java:644+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.kernel.exps.Variable.initialize({color}{color:#0066cc}+Variable.java:119+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.kernel.exps.BindVariableExpression.initialize({color}{color:#0066cc}+BindVariableExpression.java:58+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.kernel.exps.BindVariableAndExpression.initialize({color}{color:#0066cc}+BindVariableAndExpression.java:47+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.initialize({color}{color:#0066cc}+SelectConstructor.java:231+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.newSelect({color}{color:#0066cc}+SelectConstructor.java:172+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.evaluate({color}{color:#0066cc}+SelectConstructor.java:86+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.createWhereSelects({color}{color:#0066cc}+JDBCStoreQuery.java:359+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.executeQuery({color}{color:#0066cc}+JDBCStoreQuery.java:192+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.executeQuery({color}{color:#0066cc}+ExpressionStoreQuery.java:783+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.kernel.QueryImpl.execute({color}{color:#0066cc}+QueryImpl.java:1011+{color}{color:#ff0000}){color}
{color:#ff0000} at
org.apache.openjpa.kernel.QueryImpl.execute({color}{color:#0066cc}+QueryImpl.java:869+{color}{color:#ff0000}){color}
{color:#ff0000} ... 54 more{color}
h2. Here is the subject method:
{color:#7f0055}*package*{color}{color:#000000}
org.apache.openjpa.jdbc.sql;{color}
{color:#7f0055}*public*{color} {color:#7f0055}*class*{color}{color:#000000}
SelectImpl{color}
{color:#7f0055}*private*{color}{color:#000000} Joins join(String
{color}{color:#6a3e3e}name{color}{color:#000000}, ForeignKey
{color}{color:#6a3e3e}fk{color}{color:#000000}, ClassMapping
{color}{color:#6a3e3e}target{color}{color:#000000},{color}
{color:#7f0055}*int*{color} {color:#6a3e3e}subs{color}{color:#000000},
{color}{color:#7f0055}*boolean*{color}
{color:#6a3e3e}inverse{color}{color:#000000},
{color}{color:#7f0055}*boolean*{color}
{color:#6a3e3e}toMany{color}{color:#000000},
{color}{color:#7f0055}*boolean*{color}
{color:#6a3e3e}outer{color}{color:#000000}) {{color}
{color:#ff0000}. . .{color}
{color:#7f0055}*if*{color}{color:#000000}
({color}{color:#6a3e3e}createJoin{color}{color:#000000}) {{color}
{color:#7f0055}*boolean*{color}
{color:#6a3e3e}createIndex{color}{color:#000000} =
{color}{color:#7f0055}*true*{color}{color:#000000};{color}
{color:#6a3e3e}table1{color}{color:#000000} =
({color}{color:#6a3e3e}inverse{color}{color:#000000}) ?
{color}{color:#6a3e3e}fk{color}{color:#000000}.getPrimaryKeyTable() :
{color}{color:#6a3e3e}fk{color}{color:#000000}.getTable(); //{color}
{color:#000000}NPE{color}
{color:#7f0055}*if*{color}{color:#000000}
({color}{color:#0000c0}correlatedVar{color}{color:#000000} !=
{color}{color:#7f0055}*null*{color}{color:#000000}){color}
{color:#6a3e3e}createIndex{color}{color:#000000} =
{color}{color:#7f0055}*false*{color}{color:#000000}; {color}{color:#3f7f5f}//
not to create here{color}
{color:#6a3e3e}alias1{color}{color:#000000} =
{color}{color:#0000c0}_sel{color}{color:#000000}.getTableIndex({color}{color:#6a3e3e}table1{color}{color:#000000},
{color}{color:#7f0055}*this*{color}{color:#000000},
{color}{color:#6a3e3e}createIndex{color}{color:#000000});{color}
}
h2. Native Query:
{color:#ff0000}UNWRAPPED QUERY: SELECT * FROM Ledger l LEFT OUTER JOIN
trx_person tp ON l.id = tp.trx_ID LEFT OUTER JOIN person p ON p.id =
tp.person_ID WHERE p.last_name LIKE 'bel%'{color}
{color:#ff0000}26473 sccPU TRACE [http-nio-8080-exec-1] openjpa.jdbc.SQL - <t
2001566939, conn 1897759772> executing prepstmnt 92722447 {color}
{color:#ff0000}SELECT * {color}
{color:#ff0000} FROM Ledger l LEFT OUTER JOIN trx_person tp ON l.id =
tp.trx_ID LEFT {color}
{color:#ff0000} OUTER JOIN person p ON p.id = tp.person_ID {color}
{color:#ff0000} WHERE p.last_name LIKE 'bel%' {color}
{color:#ff0000}26478 sccPU TRACE [http-nio-8080-exec-1] openjpa.jdbc.SQL - <t
2001566939, conn 1897759772> [5 ms] spent{color}
{color:#ff0000}May 17, 2018 1:51:47 PM rfpeake.scc.view.JournalView
processTrxList{color}
{color:#ff0000}INFO: resultCount = 5{color}
{color:#ff0000}May 17, 2018 1:51:47 PM rfpeake.scc.view.JournalView
display{color}
{color:#ff0000}WARNING: ledger.counterparty is null{color}
While no error is thrown, the Person entity
({color:#ff0000}ledger.counterparty{color}) is not returned. {color:#000000}It
seems that{color} {color:#000000}the join table annotations are detected upon
writing data, {color}{color:#000000}but {color}{color:#000000}the
{color}{color:#000000}join table information is{color} {color:#000000}not
utiliz{color}{color:#000000}ed when querying data.
{color}{color:#000000}Executing the query in MySQL Workbench returns data from
both tables {color}{color:#000000}and will return all columns using: SELECT *
FROM ledger l.{color}
{color:#000000}See screenshot attached.{color}
{color:#000000} {color}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)