HHH-11278 - setMaxResult(0) should return an empty List
This commit is contained in:
parent
d4d1a6b8d4
commit
318473e59c
|
@ -252,6 +252,7 @@ public class CriteriaImpl implements Criteria, Serializable {
|
|||
public Integer getMaxResults() {
|
||||
return maxResults;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Criteria setMaxResults(int maxResults) {
|
||||
this.maxResults = maxResults;
|
||||
|
|
|
@ -0,0 +1,207 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.internal;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.sql.Blob;
|
||||
import java.sql.Clob;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import org.hibernate.query.spi.ScrollableResultsImplementor;
|
||||
import org.hibernate.type.Type;
|
||||
|
||||
/**
|
||||
* @author Andrea Boriero
|
||||
*/
|
||||
public class EmptyScrollableResults implements ScrollableResultsImplementor {
|
||||
|
||||
public static final ScrollableResultsImplementor INSTANCE = new EmptyScrollableResults();
|
||||
|
||||
@Override
|
||||
public boolean isClosed() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNumberOfTypes() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean next() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean previous() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean scroll(int positions) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean last() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean first() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeFirst() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterLast() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFirst() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLast() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRowNumber() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setRowNumber(int rowNumber) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] get() {
|
||||
return new Object[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object get(int i) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getType(int i) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getInteger(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getLong(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Float getFloat(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean getBoolean(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getDouble(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Short getShort(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Byte getByte(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Character getCharacter(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBinary(int col) {
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Blob getBlob(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Clob getClob(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BigDecimal getBigDecimal(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BigInteger getBigInteger(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getDate(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Locale getLocale(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Calendar getCalendar(int col) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TimeZone getTimeZone(int col) {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -1846,6 +1846,9 @@ public final class SessionImpl
|
|||
public List list(Criteria criteria) throws HibernateException {
|
||||
// TODO: Is this guaranteed to always be CriteriaImpl?
|
||||
CriteriaImpl criteriaImpl = (CriteriaImpl) criteria;
|
||||
if ( criteriaImpl.getMaxResults() != null && criteriaImpl.getMaxResults() == 0 ) {
|
||||
return Collections.EMPTY_LIST;
|
||||
}
|
||||
|
||||
final NaturalIdLoadAccess naturalIdLoadAccess = this.tryNaturalIdLoadAccess( criteriaImpl );
|
||||
if ( naturalIdLoadAccess != null ) {
|
||||
|
|
|
@ -744,6 +744,9 @@ public class ProcedureCallImpl<R>
|
|||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<R> getResultList() {
|
||||
if ( getMaxResults() == 0 ) {
|
||||
return Collections.EMPTY_LIST;
|
||||
}
|
||||
try {
|
||||
final Output rtn = outputs().getCurrent();
|
||||
if ( ! ResultSetOutput.class.isInstance( rtn ) ) {
|
||||
|
|
|
@ -55,9 +55,11 @@ import org.hibernate.engine.spi.RowSelection;
|
|||
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||
import org.hibernate.engine.spi.TypedValue;
|
||||
import org.hibernate.hql.internal.QueryExecutionRequestException;
|
||||
import org.hibernate.internal.EmptyScrollableResults;
|
||||
import org.hibernate.internal.EntityManagerMessageLogger;
|
||||
import org.hibernate.internal.HEMLogging;
|
||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
||||
import org.hibernate.internal.util.collections.EmptyIterator;
|
||||
import org.hibernate.jpa.QueryHints;
|
||||
import org.hibernate.jpa.TypedParameterValue;
|
||||
import org.hibernate.jpa.graph.internal.EntityGraphImpl;
|
||||
|
@ -815,7 +817,7 @@ public abstract class AbstractProducedQuery<R> implements QueryImplementor<R> {
|
|||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public QueryImplementor setMaxResults(int maxResult) {
|
||||
if ( maxResult <= 0 ) {
|
||||
if ( maxResult < 0 ) {
|
||||
// treat zero and negatives specially as meaning no limit...
|
||||
queryOptions.setMaxRows( null );
|
||||
}
|
||||
|
@ -1344,6 +1346,9 @@ public abstract class AbstractProducedQuery<R> implements QueryImplementor<R> {
|
|||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected Iterator<R> doIterate() {
|
||||
if (getMaxResults() == 0){
|
||||
return EmptyIterator.INSTANCE;
|
||||
}
|
||||
return getProducer().iterate(
|
||||
queryParameterBindings.expandListValuedParameters( getQueryString(), getProducer() ),
|
||||
getQueryParameters()
|
||||
|
@ -1367,6 +1372,9 @@ public abstract class AbstractProducedQuery<R> implements QueryImplementor<R> {
|
|||
}
|
||||
|
||||
protected ScrollableResultsImplementor doScroll(ScrollMode scrollMode) {
|
||||
if (getMaxResults() == 0){
|
||||
return EmptyScrollableResults.INSTANCE;
|
||||
}
|
||||
final String query = queryParameterBindings.expandListValuedParameters( getQueryString(), getProducer() );
|
||||
QueryParameters queryParameters = getQueryParameters();
|
||||
queryParameters.setScrollMode( scrollMode );
|
||||
|
@ -1376,6 +1384,10 @@ public abstract class AbstractProducedQuery<R> implements QueryImplementor<R> {
|
|||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public Stream<R> stream() {
|
||||
if (getMaxResults() == 0){
|
||||
final Spliterator<R> spliterator = Spliterators.emptySpliterator();
|
||||
return StreamSupport.stream( spliterator, false );
|
||||
}
|
||||
final ScrollableResultsImplementor scrollableResults = scroll( ScrollMode.FORWARD_ONLY );
|
||||
final ScrollableResultsIterator<R> iterator = new ScrollableResultsIterator<>( scrollableResults );
|
||||
final Spliterator<R> spliterator = Spliterators.spliteratorUnknownSize( iterator, Spliterator.NONNULL );
|
||||
|
@ -1417,6 +1429,9 @@ public abstract class AbstractProducedQuery<R> implements QueryImplementor<R> {
|
|||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected List<R> doList() {
|
||||
if ( getMaxResults() == 0 ) {
|
||||
return Collections.EMPTY_LIST;
|
||||
}
|
||||
if ( lockOptions.getLockMode() != null && lockOptions.getLockMode() != LockMode.NONE ) {
|
||||
if ( !getProducer().isTransactionInProgress() ) {
|
||||
throw new TransactionRequiredException( "no transaction is in progress" );
|
||||
|
|
Loading…
Reference in New Issue