Search in sources :

Example 16 with RowSelection

use of org.hibernate.engine.spi.RowSelection in project hibernate-orm by hibernate.

the class Loader method doQuery.

private List doQuery(final SharedSessionContractImplementor session, final QueryParameters queryParameters, final boolean returnProxies, final ResultTransformer forcedResultTransformer) throws SQLException, HibernateException {
    final RowSelection selection = queryParameters.getRowSelection();
    final int maxRows = LimitHelper.hasMaxRows(selection) ? selection.getMaxRows() : Integer.MAX_VALUE;
    final List<AfterLoadAction> afterLoadActions = new ArrayList<AfterLoadAction>();
    final SqlStatementWrapper wrapper = executeQueryStatement(queryParameters, false, afterLoadActions, session);
    final ResultSet rs = wrapper.getResultSet();
    final Statement st = wrapper.getStatement();
    try {
        return processResultSet(rs, queryParameters, session, returnProxies, forcedResultTransformer, maxRows, afterLoadActions);
    } finally {
        session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release(st);
        session.getJdbcCoordinator().afterStatementExecution();
    }
}
Also used : PreparedStatement(java.sql.PreparedStatement) CallableStatement(java.sql.CallableStatement) Statement(java.sql.Statement) AfterLoadAction(org.hibernate.loader.spi.AfterLoadAction) ArrayList(java.util.ArrayList) ResultSet(java.sql.ResultSet) RowSelection(org.hibernate.engine.spi.RowSelection)

Example 17 with RowSelection

use of org.hibernate.engine.spi.RowSelection in project hibernate-orm by hibernate.

the class AbstractLoadPlanBasedLoader method prepareQueryStatement.

/**
 * Obtain a <tt>PreparedStatement</tt> with all parameters pre-bound.
 * Bind JDBC-style <tt>?</tt> parameters, named parameters, and
 * limit parameters.
 */
protected final PreparedStatement prepareQueryStatement(final String sql, final QueryParameters queryParameters, final LimitHandler limitHandler, final boolean scroll, final SharedSessionContractImplementor session) throws SQLException, HibernateException {
    final Dialect dialect = session.getJdbcServices().getJdbcEnvironment().getDialect();
    final RowSelection selection = queryParameters.getRowSelection();
    final boolean useLimit = LimitHelper.useLimit(limitHandler, selection);
    final boolean hasFirstRow = LimitHelper.hasFirstRow(selection);
    final boolean useLimitOffset = hasFirstRow && useLimit && limitHandler.supportsLimitOffset();
    final boolean callable = queryParameters.isCallable();
    final ScrollMode scrollMode = getScrollMode(scroll, hasFirstRow, useLimitOffset, queryParameters);
    final PreparedStatement st = session.getJdbcCoordinator().getStatementPreparer().prepareQueryStatement(sql, callable, scrollMode);
    try {
        int col = 1;
        // TODO: can we limit stored procedures ?!
        col += limitHandler.bindLimitParametersAtStartOfQuery(selection, st, col);
        if (callable) {
            col = dialect.registerResultSetOutParameter((CallableStatement) st, col);
        }
        col += bindParameterValues(st, queryParameters, col, session);
        col += limitHandler.bindLimitParametersAtEndOfQuery(selection, st, col);
        limitHandler.setMaxRows(selection, st);
        if (selection != null) {
            if (selection.getTimeout() != null) {
                st.setQueryTimeout(selection.getTimeout());
            }
            if (selection.getFetchSize() != null) {
                st.setFetchSize(selection.getFetchSize());
            }
        }
        // handle lock timeout...
        final LockOptions lockOptions = queryParameters.getLockOptions();
        if (lockOptions != null) {
            if (lockOptions.getTimeOut() != LockOptions.WAIT_FOREVER) {
                if (!dialect.supportsLockTimeouts()) {
                    if (log.isDebugEnabled()) {
                        log.debugf("Lock timeout [%s] requested but dialect reported to not support lock timeouts", lockOptions.getTimeOut());
                    }
                } else if (dialect.isLockTimeoutParameterized()) {
                    st.setInt(col++, lockOptions.getTimeOut());
                }
            }
        }
        if (log.isTraceEnabled()) {
            log.tracev("Bound [{0}] parameters total", col);
        }
    } catch (SQLException sqle) {
        session.getJdbcCoordinator().getResourceRegistry().release(st);
        session.getJdbcCoordinator().afterStatementExecution();
        throw sqle;
    } catch (HibernateException he) {
        session.getJdbcCoordinator().getResourceRegistry().release(st);
        session.getJdbcCoordinator().afterStatementExecution();
        throw he;
    }
    return st;
}
Also used : ScrollMode(org.hibernate.ScrollMode) LockOptions(org.hibernate.LockOptions) SQLException(java.sql.SQLException) HibernateException(org.hibernate.HibernateException) CallableStatement(java.sql.CallableStatement) Dialect(org.hibernate.dialect.Dialect) PreparedStatement(java.sql.PreparedStatement) RowSelection(org.hibernate.engine.spi.RowSelection)

Example 18 with RowSelection

use of org.hibernate.engine.spi.RowSelection in project hibernate-orm by hibernate.

the class QueryKey method generateQueryKey.

/**
 * Generates a QueryKey.
 *
 * @param queryString The sql query string.
 * @param queryParameters The query parameters
 * @param filterKeys The keys of any enabled filters.
 * @param session The current session.
 * @param customTransformer The result transformer; should be null if data is not transformed before being cached.
 *
 * @return The generate query cache key.
 */
public static QueryKey generateQueryKey(String queryString, QueryParameters queryParameters, Set filterKeys, SharedSessionContractImplementor session, CacheableResultTransformer customTransformer) {
    // disassemble positional parameters
    final int positionalParameterCount = queryParameters.getPositionalParameterTypes().length;
    final Type[] types = new Type[positionalParameterCount];
    final Object[] values = new Object[positionalParameterCount];
    for (int i = 0; i < positionalParameterCount; i++) {
        types[i] = queryParameters.getPositionalParameterTypes()[i];
        values[i] = types[i].disassemble(queryParameters.getPositionalParameterValues()[i], session, null);
    }
    // disassemble named parameters
    final Map<String, TypedValue> namedParameters;
    if (queryParameters.getNamedParameters() == null) {
        namedParameters = null;
    } else {
        namedParameters = CollectionHelper.mapOfSize(queryParameters.getNamedParameters().size());
        for (Map.Entry<String, TypedValue> namedParameterEntry : queryParameters.getNamedParameters().entrySet()) {
            namedParameters.put(namedParameterEntry.getKey(), new TypedValue(namedParameterEntry.getValue().getType(), namedParameterEntry.getValue().getType().disassemble(namedParameterEntry.getValue().getValue(), session, null)));
        }
    }
    // decode row selection...
    final RowSelection selection = queryParameters.getRowSelection();
    final Integer firstRow;
    final Integer maxRows;
    if (selection != null) {
        firstRow = selection.getFirstRow();
        maxRows = selection.getMaxRows();
    } else {
        firstRow = null;
        maxRows = null;
    }
    return new QueryKey(queryString, types, values, namedParameters, firstRow, maxRows, filterKeys, session.getTenantIdentifier(), customTransformer);
}
Also used : RowSelection(org.hibernate.engine.spi.RowSelection) Type(org.hibernate.type.Type) Map(java.util.Map) TypedValue(org.hibernate.engine.spi.TypedValue)

Example 19 with RowSelection

use of org.hibernate.engine.spi.RowSelection in project hibernate-orm by hibernate.

the class SQLServer2005DialectTestCase method testGetLimitStringUsingCTEQueryNoOffset.

@Test
@TestForIssue(jiraKey = "HHH-8916")
public void testGetLimitStringUsingCTEQueryNoOffset() {
    RowSelection selection = toRowSelection(0, 5);
    // test top-based CTE with single CTE query definition with no odd formatting
    final String query1 = "WITH a (c1, c2) AS (SELECT c1, c2 FROM t) SELECT c1, c2 FROM a";
    assertEquals("WITH a (c1, c2) AS (SELECT c1, c2 FROM t) SELECT TOP(?) c1, c2 FROM a", dialect.getLimitHandler().processSql(query1, selection));
    // test top-based CTE with single CTE query definition and various tab, newline spaces
    final String query2 = "  \n\tWITH a (c1\n\t,c2)\t\nAS (SELECT\n\tc1,c2 FROM t)\t\nSELECT c1, c2 FROM a";
    assertEquals("  \n\tWITH a (c1\n\t,c2)\t\nAS (SELECT\n\tc1,c2 FROM t)\t\nSELECT TOP(?) c1, c2 FROM a", dialect.getLimitHandler().processSql(query2, selection));
    // test top-based CTE with multiple CTE query definitions with no odd formatting
    final String query3 = "WITH a (c1, c2) AS (SELECT c1, c2 FROM t1), b (b1, b2) AS (SELECT b1, b2 FROM t2) " + "SELECT c1, c2, b1, b2 FROM t1, t2 WHERE t1.c1 = t2.b1";
    assertEquals("WITH a (c1, c2) AS (SELECT c1, c2 FROM t1), b (b1, b2) AS (SELECT b1, b2 FROM t2) " + "SELECT TOP(?) c1, c2, b1, b2 FROM t1, t2 WHERE t1.c1 = t2.b1", dialect.getLimitHandler().processSql(query3, selection));
    // test top-based CTE with multiple CTE query definitions and various tab, newline spaces
    final String query4 = "  \n\r\tWITH a (c1, c2) AS\n\r (SELECT c1, c2 FROM t1)\n\r, b (b1, b2)\tAS\t" + "(SELECT b1, b2 FROM t2)    SELECT c1, c2, b1, b2 FROM t1, t2 WHERE t1.c1 = t2.b1";
    assertEquals("  \n\r\tWITH a (c1, c2) AS\n\r (SELECT c1, c2 FROM t1)\n\r, b (b1, b2)\tAS\t(SELECT b1, b2 FROM t2)" + "    SELECT TOP(?) c1, c2, b1, b2 FROM t1, t2 WHERE t1.c1 = t2.b1", dialect.getLimitHandler().processSql(query4, selection));
}
Also used : RowSelection(org.hibernate.engine.spi.RowSelection) Test(org.junit.Test) TestForIssue(org.hibernate.testing.TestForIssue)

Aggregations

RowSelection (org.hibernate.engine.spi.RowSelection)19 PreparedStatement (java.sql.PreparedStatement)5 ArrayList (java.util.ArrayList)5 SQLException (java.sql.SQLException)4 CallableStatement (java.sql.CallableStatement)3 List (java.util.List)3 HibernateException (org.hibernate.HibernateException)3 LockOptions (org.hibernate.LockOptions)3 QueryParameters (org.hibernate.engine.spi.QueryParameters)3 TestForIssue (org.hibernate.testing.TestForIssue)3 Test (org.junit.Test)3 SQLQuery (org.hibernate.SQLQuery)2 ScrollMode (org.hibernate.ScrollMode)2 Dialect (org.hibernate.dialect.Dialect)2 LimitHandler (org.hibernate.dialect.pagination.LimitHandler)2 TypedValue (org.hibernate.engine.spi.TypedValue)2 IdentitySet (org.hibernate.internal.util.collections.IdentitySet)2 Type (org.hibernate.type.Type)2 ResultSet (java.sql.ResultSet)1 Statement (java.sql.Statement)1