List of usage examples for org.hibernate.engine.query.spi HQLQueryPlan getReturnMetadata
public ReturnMetadata getReturnMetadata()
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; }