jsr338-experts@jpa-spec.java.net

[jsr338-experts] Re: outer joins with ON conditions

From: Gordon Yorke <gordon.yorke_at_oracle.com>
Date: Mon, 21 Mar 2011 18:54:05 -0300

It is better if the On() returns the Join instance. This allows for
chaining of the Criteria query calls and follows an existing pattern we
used in Criteria Queries (eg, Coalesce)
--Gordon


Linda DeMichiel wrote:
>
>
> On 3/17/2011 9:42 AM, Rainer Kwesi Schweigkoffer wrote:
>> Hi Linda, all,
>>
>> Linda DeMichiel, am 11 Mar 2011 hast Du um 13:30 zum Thema
>> "[jsr338-experts] outer joins with ON conditions" geschrieben :
>>
>>> For the criteria API equivalent, we could add methods
>>>
>>> on(Expression<Boolean> restriction);
>>> and
>>>
>>> on(Predicate... restriction);
>>>
>>> to the Join interface.
>>>
>>> I'm not however sure what it is best that these methods return.
>>
>> What are your concerns against returning the Join instance they're
>> residing on (i.e. overriding the method on the subinterfaces of Join
>> declaring the respective type each) ?
>>
>
> I was wondering whether on() should return void. For example, in
> the following, how do the Join objects relate?
>
> // SELECT DISTINCT c
> // FROM Customer c JOIN c.orders o
> // ON c.address.city = o.shippingAddress.city
> // JOIN o.product p
> // ON o.quantity < p.inStock
>
>
> CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
> Root<Customer> customer = q.from(Customer.class);
> Join<Customer,Order> order = customer.join(Customer_.orders);
> Join<Customer,Order> order2 =
>
> order.on(cb.equal(customer.get(Customer_.address).get(Address_.city),
>
> order.get(Order_.shippingAddress).get(Address_.city)));
> Join<Order, Product> product = order.join(Order_.product); // or
> order2 ?
> product.on(cb.lt(order.get(Order_.quantity),
> product.get(Product_.inStock)));
> q.select(customer).distinct(true);
>
>
>
>>> Finally, we should also discuss whether we should support the use of
>>> ON with inner joins. SQL supports this, with the semantics that it is
>>> equivalent to the use of WHERE.
>>
>> While I personally don't feel the desire to provide a second syntax
>> of identical meaning, I fear, the way the criteria API has been
>> designed practically forces us into this. And, as SQL does the same,
>> it probably meets the expectations of the users...
>>
>
> Agreed. I think it is conceptually the simplest.
>
> best regards,
>
> -Linda
>
>
>> Best regards
>> Rainer
>>
>> ---
>> Rainer Schweigkoffer SAP AG Walldorf
>> Business Solution & Technology TD Core JS&I
>> Technology Development Dietmar-Hopp-Allee 16
>> Java Server Core D-69190 Walldorf
>> JEE Implementation Group phone: +49 6227 7 45305
>> Building 3, I.3.14 fax: +49 6227 7 821177
>> rainer.schweigkoffer_at_sap.com
>>
>> Sitz der Gesellschaft/Registered Office: Walldorf, Germany
>> Vorstand/SAP Executive Board: Werner Brandt, Angelika Dammann,
>> Bill McDermott (Co-CEO), Gerhard Oswald, Vishal Sikka,
>> Jim Hagemann Snabe (Co-CEO)
>> Vorsitzender des Aufsichtsrats/Chairperson of the SAP Supervisory
>> Board: Hasso Plattner
>> Registergericht/Commercial Register Mannheim No HRB 350269
>>
>> Diese E-Mail kann Betriebs- oder Geschaeftsgeheimnisse oder sonstige
>> vertrauliche Informationen enthalten. Sollten Sie diese E-Mail
>> irrtuemlich erhalten haben, ist Ihnen eine Verwertung des Inhalts,
>> eine Vervielfaeltigung oder Weitergabe der E-Mail ausdruecklich
>> untersagt. Bitte benachrichtigen Sie uns und vernichten Sie die
>> empfangene E-Mail. Vielen Dank.
>>
>> This e-mail may contain trade secrets or privileged, undisclosed, or
>> otherwise confidential information. If you have received this e-mail
>> in error, you are hereby notified that any review, copying, or
>> distribution of it is strictly prohibited. Please inform us
>> immediately and destroy the original transmittal. Thank you for your
>> cooperation.
>>
>>