users@jpa-spec.java.net

[jpa-spec users] Re: JPA_SPEC-99: Add ability to stream the result of a query execution

From: Linda DeMichiel <linda.demichiel_at_oracle.com>
Date: Fri, 05 May 2017 11:50:43 -0700

Hi all,

To me this still sounds very vendor-specific at this point.

Wouldn't it be better to just allow vendors to provide such
functionality through the loophole that we currently have -- i.e.,
by an unwrap of the Query object into the vendor-specific one.

Then once we can agree on some more specific semantics here this
can be standardized in a future release.

We might want to add an unwrap to TypedQuery as well, but that
is trivial enough.

-Linda


On 5/5/17, 11:40 AM, Lukas Jungmann wrote:
> Hi,
>
>
> On 5/4/17 11:35 PM, Linda DeMichiel wrote:
>> Hi,
>>
>> If the value is mostly in the provider-specific add-ons, then I
>> think it would be better to wait and standardize in a later
>> release.
>>
>> What did you have in mind here?
>
> basically provide an API returning a Stream which is not constrained by
> some specific characteristics (as Oliver pointed users expectation may
> vary here) while still having ability to constrain them, or maybe better
> - influence the behaviour of the returned stream through provider
> specific QueryHints.
>
> as for the name of the method - I've chosen 'getResultStream' to be
> consistent with existing methods; but I don't mind if I'm over voted
> here as long as we have sth like this availiable
>
> thanks,
> --lukas
>>
>> -Linda
>>
>>
>> On 5/4/17, 1:01 PM, Lukas Jungmann wrote:
>>> Hi,
>>>
>>> another change I'd like to propose is an addition of
>>> getResultStream:Stream method to javax.persistence.Query/TypedQuery
>>> interfaces with following javadoc and provided with default
>>> implementation:
>>>
>>> javax.persistence.Query:
>>>
>>> / /**//
>>> // * Execute a SELECT query and return the query results//
>>> // * as an untyped <code>java.util.Stream</code>.//
>>> // * By default this method delegates to
>>> <code>getResultList().stream()</code>,//
>>> // * however persistence provider may choose to override this
>>> method//
>>> // * to provide additional capabilities.//
>>> // *//
>>> // * @return a stream of the results//
>>> // * @throws IllegalStateException if called for a Java//
>>> // * Persistence query language UPDATE or DELETE statement//
>>> // * @throws QueryTimeoutException if the query execution exceeds//
>>> // * the query timeout value set and only the statement is//
>>> // * rolled back//
>>> // * @throws TransactionRequiredException if a lock mode other
>>> than//
>>> // * <code>NONE</code> has been set and there is no
>>> transaction//
>>> // * or the persistence context has not been joined to the
>>> transaction//
>>> // * @throws PessimisticLockException if pessimistic locking//
>>> // * fails and the transaction is rolled back//
>>> // * @throws LockTimeoutException if pessimistic locking//
>>> // * fails and only the statement is rolled back//
>>> // * @throws PersistenceException if the query execution exceeds //
>>> // * the query timeout value set and the transaction //
>>> // * is rolled back //
>>> // * @see Stream//
>>> // * @see #getResultList()//
>>> // * @since 2.2//
>>> // *///
>>> // default Stream getResultStream() {//
>>> // return getResultList().stream();//
>>> // }/
>>>
>>> similarly to javax.persistence.TypedQuery:
>>>
>>> / /**//
>>> // * Execute a SELECT query and return the query results//
>>> // * as a typed <code>java.util.Stream</code>.//
>>> // * By default this method delegates to
>>> <code>getResultList().stream()</code>,//
>>> // * however persistence provider may choose to override this
>>> method//
>>> // * to provide additional capabilities.//
>>> // *//
>>> // * @return a stream of the results//
>>> // * @throws IllegalStateException if called for a Java//
>>> // * Persistence query language UPDATE or DELETE statement//
>>> // * @throws QueryTimeoutException if the query execution exceeds//
>>> // * the query timeout value set and only the statement is//
>>> // * rolled back//
>>> // * @throws TransactionRequiredException if a lock mode other
>>> than//
>>> // * <code>NONE</code> has been set and there is no
>>> transaction//
>>> // * or the persistence context has not been joined to the
>>> transaction//
>>> // * @throws PessimisticLockException if pessimistic locking//
>>> // * fails and the transaction is rolled back//
>>> // * @throws LockTimeoutException if pessimistic locking//
>>> // * fails and only the statement is rolled back//
>>> // * @throws PersistenceException if the query execution exceeds //
>>> // * the query timeout value set and the transaction //
>>> // * is rolled back //
>>> // * @see Stream//
>>> // * @see #getResultList()//
>>> // * @since 2.2//
>>> // *///
>>> // default Stream<X> getResultStream() {//
>>> // return getResultList().stream();//
>>> // }/
>>>
>>> Do you think this is OK or does it give providers to big freedom?
>>>
>>> Thank you,
>>> --lukas
>>>
>