users@jpa-spec.java.net

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

From: Lukas Jungmann <lukas.jungmann_at_oracle.com>
Date: Thu, 4 May 2017 22:01:41 +0200

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