Re: [eclipselink-users] Conditional LEFT JOIN in JPQL
Since this is a spec issue, feedback to the spec group is likely the best
long term solution.
In the short to medium term, it is a matter of determining what EclipseLink
can do for you. For our upcoming 2.1 release we have been adding some
enhancements to the way queries can be run. (downcasting and a function
operator in JPQL so far and some fetch group support through hints and
configuration options), so changes to the way queries work are not out of the
question. We are, however, somewhat limited in the degree to which we can
change JPQL - i.e. we have to remain TCK compliant and we do not want to add
JPQL that will be disallowed by later specifications. As a result we have been
hesitant to address issues in JPQL that require major grammar rewrites.
Have you looked at the criteria API? I haven't had a chance to investigate
how one would write this kind of query in the criteria API, but it is, in some
ways more flexible that JPQL especially with regards to how joins are handled.
Assuming that is of no help, perhaps your best bet is EclipseLink native API.
Is that an option for you - since you are asking for a non-spec feature anyway?
Thanks for that. It is amazing how many incident records the community
had to keep track of with regard to this single issue. I wasn't aware
of this one.
You did not mention the JPQL issue. Where is this tracked? As I wrote,
I prefer to stay clear of bad practices in standard use cases such as
this common outer join application.
This seems to be a bigger one as it is on the specification level,
where EL would not have a compliance issue. Is that why you do not
On Mon, 03 May 2010 15:13:10 -0400, you wrote:
With respect to case and native queries, you will find that EclipseLink
has worked around the problem of databases returning different cases
through bug 299926
If using a recent EclipseLink nightly build, you should not see case
issues when using native SQL (unless your database is case sensitive).
On 03/05/2010 3:03 PM, bht@xxxxxxxxxxxxx wrote:
It should be possible.
However there are major limitations with conditional left join in JPQL
and this is a BIG problem.
For example, in a product list display, alongside with each list item,
we would want an indicator showing whether the item exists in the
user's list of favorite items. An outer join clause with such a
condition defining the join is the only practical way to do this. This
is industry standard, except it is NOT supported in JPQL.
In JPQL, You cannot code outer join "ON" something other than what is
already obvious from relationships. In fact "ON" is not supported.
In SQL you can say:
SELECT d.name, count( v.id ) FROM dealer d LEFT OUTER JOIN vehicle v
ON v.dealer_id = d.dealer_id AND v.type = 'New' GROUP BY d.name
In JPQL, you only have the WHERE clause which limits your results,
making the outer join useless:
SELECT d.name, count( v.id ) FROM dealer d LEFT OUTER JOIN
d.vehicleList v WHERE v.type = 'New' GROUP BY d.name
PLease refer to:
One can work around this with a native query, but this is a really
lame suggestion because there are a number of problems with them -
they are not best practice. I found them very difficult to work with
in this scenario because of unexpected case sensitivity issues in the
query itself (not the data) when using @SqlResultSetMapping. You will
discover the whole glory when you get there:
Request for input - TLE case sensitivity
Unless fields are wrapped in quotes,
Oracle returns fields in uppercase,
Sybase returns them as they were defined,
and Postgres returns them in lowercase.
Unquoted object names fold to lower case (folding behavior)
On Mon, 3 May 2010 01:39:31 -0700 (PDT), you wrote:
I have two questions about JOIN's in JPQL:
1. Is it possible to write a conditional LEFT JOIN with JPQL, which in SQL
SELECT a.*, b.*, c.*
FROM entityA a
LEFT JOIN entityB b ON a.id=b.a_id AND b.some_field="some_value"
LEFT JOIN entityC c ON a.id=c.a_id AND c.some_field="some_value"
2. Can I use LEFT JOIN's in JPQL on entities, which don't have relationship
annotations between each other?
eclipselink-users mailing list
eclipselink-users mailing list