Example usage for org.hibernate.engine.query.spi HQLQueryPlan getReturnMetadata

List of usage examples for org.hibernate.engine.query.spi HQLQueryPlan getReturnMetadata

Introduction

In this page you can find the example usage for org.hibernate.engine.query.spi HQLQueryPlan getReturnMetadata.

Prototype

public ReturnMetadata getReturnMetadata() 

Source Link

Usage

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

License:Apache License

@Override
public int executeUpdate(com.blazebit.persistence.spi.ServiceProvider serviceProvider,
        List<Query> participatingQueries, Query baseQuery, Query query, String finalSql) {
    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 .  jav a  2  s.  c  om

    Integer firstResult = null;
    Integer maxResults = null;

    if (query.getFirstResult() > 0) {
        firstResult = query.getFirstResult();
    }
    if (query.getMaxResults() != Integer.MAX_VALUE) {
        maxResults = query.getMaxResults();
    }

    // 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;

    QueryPlanCacheKey cacheKey = createCacheKey(queryStrings, firstResult, maxResults);
    CacheEntry<HQLQueryPlan> queryPlanEntry = getQueryPlan(sfi, query, cacheKey);
    HQLQueryPlan queryPlan = queryPlanEntry.getValue();

    if (!queryPlanEntry.isFromCache()) {
        prepareQueryPlan(queryPlan, queryParametersEntry.specifications, finalSql, session, baseQuery, true,
                dbmsDialect);
        queryPlan = putQueryPlanIfAbsent(sfi, cacheKey, queryPlan);
    }

    autoFlush(querySpaces, session);

    if (queryPlan.getReturnMetadata() == null) {
        return hibernateAccess.performExecuteUpdate(queryPlan, session, queryParameters);
    }

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

    try {
        @SuppressWarnings("unchecked")
        List<Object> results = hibernateAccess.performList(queryPlan,
                wrapSession(session, dbmsDialect, returningColumns, returningColumnTypes, null),
                queryParameters);

        if (results.size() != 1) {
            throw new IllegalArgumentException("Expected size 1 but was: " + results.size());
        }

        Number count = (Number) results.get(0);
        return count.intValue();
    } 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);
        hibernateAccess.throwPersistenceException(em, he);
        return 0;
    }
}

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

License:Apache License

private static int[] getReturningColumnTypes(HQLQueryPlan queryPlan, SessionFactoryImplementor sfi) {
    List<Integer> sqlTypes = new ArrayList<>();
    Type[] types = queryPlan.getReturnMetadata().getReturnTypes();

    for (int i = 0; i < types.length; i++) {
        int[] sqlTypeArray = types[i].sqlTypes(sfi);
        for (int j = 0; j < sqlTypeArray.length; j++) {
            sqlTypes.add(sqlTypeArray[j]);
        }/*from   www. j  a  v a2s  .  co  m*/
    }

    int[] returningColumnTypes = new int[sqlTypes.size()];
    for (int i = 0; i < sqlTypes.size(); i++) {
        returningColumnTypes[i] = sqlTypes.get(i);
    }

    return returningColumnTypes;
}