Example usage for org.hibernate.engine.spi QueryParameters getRowSelection

List of usage examples for org.hibernate.engine.spi QueryParameters getRowSelection

Introduction

In this page you can find the example usage for org.hibernate.engine.spi QueryParameters getRowSelection.

Prototype

public RowSelection getRowSelection() 

Source Link

Usage

From source file:org.babyfish.hibernate.hql.XQueryPlan.java

License:Open Source License

public <T> List<T> performList(SessionImplementor session, QueryParameters queryParameters,
        QueryType queryMode) {//from   w  w w  . ja v a 2 s.  c o m
    if (log.isTraceEnabled()) {
        log.trace("find: " + getSourceQuery());
        queryParameters.traceParameters(session.getFactory());
    }
    QueryTranslator[] translators = this.getTranslators();
    boolean hasLimit = queryParameters.getRowSelection() != null
            && queryParameters.getRowSelection().definesLimits();
    boolean needsMemoryLimit = hasLimit && translators.length > 1;
    QueryParameters queryParametersToUse;
    if (needsMemoryLimit) {
        if (!SettingsFactory.isLimitInMemoryEnabled(session.getFactory().getProperties())) {
            throw new QueryException(LAZY_RESOURCE.get().hibernateLimitInMemoryForPolymorphicQueryIsNotEnabled(
                    SettingsFactory.ENABLE_LIMIT_IN_MEMORY));
        }
        log.warn("firstResult/maxResults specified on polymorphic query; applying in memory!");
        RowSelection selection = new RowSelection();
        selection.setFetchSize(queryParameters.getRowSelection().getFetchSize());
        selection.setTimeout(queryParameters.getRowSelection().getTimeout());
        queryParametersToUse = queryParameters.createCopyUsing(selection);
    } else {
        queryParametersToUse = queryParameters;
    }

    List<T> combinedResults = new ArrayList<T>();
    Set<T> distinction = new LinkedHashSet<T>(ReferenceEqualityComparator.getInstance());
    int includedCount = -1;
    translator_loop: for (int i = 0; i < translators.length; i++) {
        List<T> tmp = ((XQueryTranslator) translators[i]).list(session, queryParametersToUse, queryMode);
        if (needsMemoryLimit) {
            // NOTE : firstRow is zero-based
            int first = queryParameters.getRowSelection().getFirstRow() == null ? 0
                    : queryParameters.getRowSelection().getFirstRow().intValue();
            int max = queryParameters.getRowSelection().getMaxRows() == null ? -1
                    : queryParameters.getRowSelection().getMaxRows().intValue();
            final int size = tmp.size();
            for (int x = 0; x < size; x++) {
                final T result = tmp.get(x);
                if (!distinction.add(result)) {
                    continue;
                }
                includedCount++;
                if (includedCount < first) {
                    continue;
                }
                combinedResults.add(result);
                if (max >= 0 && includedCount > max) {
                    break translator_loop; // break the outer loop !!!
                }
            }
        } else {
            if (translators.length == 1) {
                return tmp;
            } else {
                combinedResults.addAll(tmp);
            }
        }
    }
    return combinedResults;
}

From source file:org.babyfish.hibernate.hql.XQueryTranslatorImpl.java

License:Open Source License

@SuppressWarnings({ "unchecked", "rawtypes" })
@Override/*from  w ww  . j a  v a  2  s.c  o m*/
public <T> List<T> list(SessionImplementor session, QueryParameters queryParameters, QueryType queryType) {
    if (queryType == QueryType.DISTINCT) {
        List<T> tmp;
        if (this.distinctLimitQueryLoader != null) {
            tmp = (List) this.distinctLimitQueryLoader.list(session, queryParameters);
        } else {
            boolean hasLimit = queryParameters.getRowSelection() != null
                    && queryParameters.getRowSelection().definesLimits();
            if (hasLimit && this.containsCollectionFetches()) {
                if (!SettingsFactory.isLimitInMemoryEnabled(session.getFactory().getProperties())) {
                    throw new QueryException(LAZY_RESOURCE.get()
                            .hibernateLimitInMemoryForCollectionFetchIsNotEnabled(DistinctLimitDialect.class,
                                    Oracle10gDialect.class, SettingsFactory.ENABLE_LIMIT_IN_MEMORY));
                }
            }
            tmp = this.list(session, queryParameters);
        }
        Set<T> distinction = new LinkedHashSet<T>(ReferenceEqualityComparator.getInstance());
        distinction.addAll(tmp);
        List<T> results = new ArrayList<T>(distinction.size());
        results.addAll(distinction);
        this.applyScalarEagerness(results, session);
        return results;
    } else {
        return this.queryLoader.list(session, queryParameters);
    }
}

From source file:org.babyfish.hibernate.loader.UnlimitedCountLoader.java

License:Open Source License

@SuppressWarnings("unchecked")
@Override// w w  w.j av  a 2  s .  c  o  m
public final List<Long> list(SessionImplementor session, QueryParameters queryParameters)
        throws HibernateException {
    boolean hasLimit = queryParameters.getRowSelection() != null
            && queryParameters.getRowSelection().definesLimits();
    if (hasLimit) {
        RowSelection selection = new RowSelection();
        selection.setFetchSize(queryParameters.getRowSelection().getFetchSize());
        selection.setTimeout(queryParameters.getRowSelection().getTimeout());
        queryParameters = queryParameters.createCopyUsing(selection);
    }
    return super.list(session, queryParameters);
}