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

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

Introduction

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

Prototype

public void validateParameters() throws QueryException 

Source Link

Usage

From source file:com.blazebit.persistence.integration.hibernate.base.HibernateExtendedQuerySupport.java

License:Apache License

@Override
@SuppressWarnings("unchecked")
public ReturningResult<Object[]> executeReturning(com.blazebit.persistence.spi.ServiceProvider serviceProvider,
        List<Query> participatingQueries, Query modificationBaseQuery, Query exampleQuery, String sqlOverride) {
    DbmsDialect dbmsDialect = serviceProvider.getService(DbmsDialect.class);
    EntityManager em = serviceProvider.getService(EntityManager.class);
    SessionImplementor session = em.unwrap(SessionImplementor.class);
    SessionFactoryImplementor sfi = session.getFactory();

    if (session.isClosed()) {
        throw new PersistenceException("Entity manager is closed!");
    }//from w  w  w  .  j av a 2 s  . c o  m

    // Create combined query parameters
    List<String> queryStrings = new ArrayList<>(participatingQueries.size());
    Set<String> querySpaces = new HashSet<>();
    QueryParamEntry queryParametersEntry = createQueryParameters(em, participatingQueries, queryStrings,
            querySpaces);
    QueryParameters queryParameters = queryParametersEntry.queryParameters;

    // Create plan for example query
    QueryPlanCacheKey cacheKey = createCacheKey(queryStrings);
    CacheEntry<HQLQueryPlan> queryPlanEntry = getQueryPlan(sfi, exampleQuery, cacheKey);
    HQLQueryPlan queryPlan = queryPlanEntry.getValue();
    String exampleQuerySql = queryPlan.getSqlStrings()[0];

    StringBuilder sqlSb = new StringBuilder(sqlOverride.length() + 100);
    sqlSb.append(sqlOverride);

    boolean caseInsensitive = !Boolean.valueOf(serviceProvider.getService(ConfigurationSource.class)
            .getProperty("com.blazebit.persistence.returning_clause_case_sensitive"));
    String[][] returningColumns = getReturningColumns(caseInsensitive, exampleQuerySql);
    int[] returningColumnTypes = dbmsDialect.needsReturningSqlTypes() ? getReturningColumnTypes(queryPlan, sfi)
            : null;
    String finalSql = sqlSb.toString();

    try {
        HibernateReturningResult<Object[]> returningResult = new HibernateReturningResult<Object[]>();
        if (!queryPlanEntry.isFromCache()) {
            prepareQueryPlan(queryPlan, queryParametersEntry.specifications, finalSql, session,
                    modificationBaseQuery, true, dbmsDialect);
            queryPlan = putQueryPlanIfAbsent(sfi, cacheKey, queryPlan);
        }

        if (queryPlan.getTranslators().length > 1) {
            throw new IllegalArgumentException("No support for multiple translators yet!");
        }

        QueryTranslator queryTranslator = queryPlan.getTranslators()[0];

        // If the DBMS doesn't support inclusion of cascading deletes in a with clause, we have to execute them manually
        StatementExecutor executor = getExecutor(queryTranslator, session, modificationBaseQuery);
        List<String> originalDeletes = Collections.emptyList();

        if (executor != null && executor instanceof DeleteExecutor) {
            originalDeletes = getField(executor, "deletes");
        }

        // Extract query loader for native listing
        QueryLoader queryLoader = getField(queryTranslator, "queryLoader");

        // Do the native list operation with custom session and combined parameters

        /*
         * NATIVE LIST START
         */
        hibernateAccess.checkTransactionSynchStatus(session);
        queryParameters.validateParameters();
        autoFlush(querySpaces, session);

        List<Object[]> results = Collections.EMPTY_LIST;
        boolean success = false;

        try {
            for (String delete : originalDeletes) {
                hibernateAccess.doExecute(executor, delete, queryParameters, session,
                        queryParametersEntry.specifications);
            }

            results = hibernateAccess.list(queryLoader,
                    wrapSession(session, dbmsDialect, returningColumns, returningColumnTypes, returningResult),
                    queryParameters);
            success = true;
        } catch (QueryExecutionRequestException he) {
            LOG.severe("Could not execute the following SQL query: " + finalSql);
            throw new IllegalStateException(he);
        } catch (TypeMismatchException e) {
            LOG.severe("Could not execute the following SQL query: " + finalSql);
            throw new IllegalArgumentException(e);
        } catch (HibernateException he) {
            LOG.severe("Could not execute the following SQL query: " + finalSql);
            throw hibernateAccess.convert(em, he);
        } finally {
            hibernateAccess.afterTransaction(session, success);
        }
        /*
         * NATIVE LIST END
         */

        returningResult.setResultList(results);
        return returningResult;
    } catch (Exception e1) {
        throw new RuntimeException(e1);
    }
}

From source file:org.babyfish.hibernate.internal.SessionImplWrapper.java

License:Open Source License

@SuppressWarnings("unchecked")
protected static <T> List<T> list(XSessionImplementor sessionProxy, String query,
        QueryParameters queryParameters, QueryType queryType, PathPlanKey pathPlanKey)
        throws HibernateException {
    errorIfClosed(sessionProxy.getRawSessionImpl());
    checkTransactionSynchStatus(sessionProxy.getRawSessionImpl());
    queryParameters.validateParameters();
    XQueryPlanCache queryPlanCache = (XQueryPlanCache) sessionProxy.getFactory().getQueryPlanCache();
    XQueryPlan plan = queryPlanCache.getHQLQueryPlan(query, pathPlanKey, false,
            sessionProxy.getRawSessionImpl().getEnabledFilters());
    autoFlushIfRequired(sessionProxy.getRawSessionImpl(), plan.getQuerySpaces());

    List<T> results;//  w w w. j a  v a  2  s.com
    boolean success = false;

    //stops flush being called multiple times if this method is recursively called
    increaseDontFlushFromFind(sessionProxy.getRawSessionImpl());
    try {
        results = plan.performList(sessionProxy.getRawSessionImpl(), queryParameters, queryType);
        success = true;
    } finally {
        decreaseDontFlushFromFind(sessionProxy.getRawSessionImpl());
        afterOperation(sessionProxy.getRawSessionImpl(), success);
    }
    return results;
}

From source file:org.babyfish.hibernate.internal.SessionImplWrapper.java

License:Open Source License

@SuppressWarnings("unchecked")
protected static long unlimitedCount(XSessionImplementor sessionProxy, String query,
        QueryParameters queryParameters, QueryType queryType, PathPlanKey pathPlanKey)
        throws HibernateException {
    errorIfClosed(sessionProxy.getRawSessionImpl());
    checkTransactionSynchStatus(sessionProxy.getRawSessionImpl());
    queryParameters.validateParameters();
    XQueryPlanCache queryPlanCache = (XQueryPlanCache) sessionProxy.getFactory().getQueryPlanCache();
    XQueryPlan plan = queryPlanCache.getHQLQueryPlan(query, pathPlanKey, false,
            sessionProxy.getRawSessionImpl().getEnabledFilters());
    autoFlushIfRequired(sessionProxy.getRawSessionImpl(), plan.getQuerySpaces());

    long count = 0;
    boolean success = false;

    //stops flush being called multiple times if this method is recursively called
    increaseDontFlushFromFind(sessionProxy.getRawSessionImpl());
    try {/*from   w  w  w . j  av a 2  s.c  o m*/
        count = plan.performUnlimitedCount(sessionProxy.getRawSessionImpl(), queryParameters, queryType);
        success = true;
    } finally {
        decreaseDontFlushFromFind(sessionProxy.getRawSessionImpl());
        afterOperation(sessionProxy.getRawSessionImpl(), success);
    }
    return count;
}