List of usage examples for org.hibernate.engine.spi QueryParameters traceParameters
public void traceParameters(SessionFactoryImplementor factory) throws HibernateException
From source file:org.babyfish.hibernate.hql.XQueryPlan.java
License:Open Source License
public <T> List<T> performList(SessionImplementor session, QueryParameters queryParameters, QueryType queryMode) {// w w w . j av 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; }