use of org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl in project hibernate-orm by hibernate.
the class NativeNonSelectQueryPlanImpl method executeUpdate.
@Override
public int executeUpdate(DomainQueryExecutionContext executionContext) {
executionContext.getSession().autoFlushIfRequired(affectedTableNames);
BulkOperationCleanupAction.schedule(executionContext.getSession(), affectedTableNames);
final List<JdbcParameterBinder> jdbcParameterBinders;
final JdbcParameterBindings jdbcParameterBindings;
final QueryParameterBindings queryParameterBindings = executionContext.getQueryParameterBindings();
if (parameterList == null || parameterList.isEmpty()) {
jdbcParameterBinders = Collections.emptyList();
jdbcParameterBindings = JdbcParameterBindings.NO_BINDINGS;
} else {
jdbcParameterBinders = new ArrayList<>(parameterList.size());
jdbcParameterBindings = new JdbcParameterBindingsImpl(parameterList.size());
jdbcParameterBindings.registerNativeQueryParameters(queryParameterBindings, parameterList, jdbcParameterBinders, executionContext.getSession().getFactory());
}
final JdbcMutation jdbcMutation = new NativeJdbcMutation(sql, jdbcParameterBinders, affectedTableNames);
final JdbcMutationExecutor executor = StandardJdbcMutationExecutor.INSTANCE;
final SharedSessionContractImplementor session = executionContext.getSession();
// return jdbcServices.getJdbcMutationExecutor().execute(
return executor.execute(jdbcMutation, jdbcParameterBindings, sql -> session.getJdbcCoordinator().getStatementPreparer().prepareStatement(sql), (integer, preparedStatement) -> {
}, SqmJdbcExecutionContextAdapter.usingLockingAndPaging(executionContext));
}
use of org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl in project hibernate-orm by hibernate.
the class SingleIdEntityLoaderDynamicBatch method load.
@Override
public T load(Object pkValue, Object entityInstance, LockOptions lockOptions, Boolean readOnly, SharedSessionContractImplementor session) {
final Object[] batchIds = session.getPersistenceContextInternal().getBatchFetchQueue().getBatchLoadableEntityIds(getLoadable(), pkValue, maxBatchSize);
final int numberOfIds = ArrayHelper.countNonNull(batchIds);
if (numberOfIds <= 1) {
initializeSingleIdLoaderIfNeeded(session);
final T result = singleIdLoader.load(pkValue, entityInstance, lockOptions, readOnly, session);
if (result == null) {
// There was no entity with the specified ID. Make sure the EntityKey does not remain
// in the batch to avoid including it in future batches that get executed.
BatchFetchQueueHelper.removeBatchLoadableEntityKey(pkValue, getLoadable(), session);
}
return result;
}
final Object[] idsToLoad = new Object[numberOfIds];
System.arraycopy(batchIds, 0, idsToLoad, 0, numberOfIds);
if (log.isDebugEnabled()) {
log.debugf("Batch loading entity [%s] : %s", getLoadable().getEntityName(), idsToLoad);
}
final List<JdbcParameter> jdbcParameters = new ArrayList<>();
final SelectStatement sqlAst = LoaderSelectBuilder.createSelect(getLoadable(), // null here means to select everything
null, getLoadable().getIdentifierMapping(), null, numberOfIds, session.getLoadQueryInfluencers(), lockOptions, jdbcParameters::add, session.getFactory());
final SessionFactoryImplementor sessionFactory = session.getFactory();
final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory();
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(getLoadable().getIdentifierMapping().getJdbcTypeCount());
int offset = 0;
for (int i = 0; i < numberOfIds; i++) {
offset += jdbcParameterBindings.registerParametersForEachJdbcValue(idsToLoad[i], Clause.WHERE, offset, getLoadable().getIdentifierMapping(), jdbcParameters, session);
}
assert offset == jdbcParameters.size();
final JdbcSelect jdbcSelect = sqlAstTranslatorFactory.buildSelectTranslator(sessionFactory, sqlAst).translate(jdbcParameterBindings, QueryOptions.NONE);
final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler = SubselectFetch.createRegistrationHandler(session.getPersistenceContext().getBatchFetchQueue(), sqlAst, jdbcParameters, jdbcParameterBindings);
JdbcSelectExecutorStandardImpl.INSTANCE.list(jdbcSelect, jdbcParameterBindings, getExecutionContext(pkValue, entityInstance, readOnly, lockOptions, session, subSelectFetchableKeysHandler), RowTransformerPassThruImpl.instance(), ListResultsConsumer.UniqueSemantic.FILTER);
// noinspection ForLoopReplaceableByForEach
for (int i = 0; i < idsToLoad.length; i++) {
final Object id = idsToLoad[i];
// found or not, remove the key from the batch-fetch queye
BatchFetchQueueHelper.removeBatchLoadableEntityKey(id, getLoadable(), session);
}
final EntityKey entityKey = session.generateEntityKey(pkValue, getLoadable().getEntityPersister());
// noinspection unchecked
return (T) session.getPersistenceContext().getEntity(entityKey);
}
use of org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl in project hibernate-orm by hibernate.
the class SingleIdLoadPlan method load.
public T load(Object restrictedValue, Object entityInstance, Boolean readOnly, Boolean singleResultExpected, SharedSessionContractImplementor session) {
final int jdbcTypeCount = restrictivePart.getJdbcTypeCount();
assert jdbcParameters.size() % jdbcTypeCount == 0;
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(jdbcTypeCount);
jdbcSelect.bindFilterJdbcParameters(jdbcParameterBindings);
int offset = 0;
while (offset < jdbcParameters.size()) {
offset += jdbcParameterBindings.registerParametersForEachJdbcValue(restrictedValue, Clause.WHERE, offset, restrictivePart, jdbcParameters, session);
}
assert offset == jdbcParameters.size();
final QueryOptions queryOptions = new SimpleQueryOptions(lockOptions, readOnly);
final Callback callback = new CallbackImpl();
final List<T> list = JdbcSelectExecutorStandardImpl.INSTANCE.list(jdbcSelect, jdbcParameterBindings, new ExecutionContext() {
@Override
public SharedSessionContractImplementor getSession() {
return session;
}
@Override
public Object getEntityInstance() {
return entityInstance;
}
@Override
public Object getEntityId() {
return restrictedValue;
}
@Override
public QueryOptions getQueryOptions() {
return queryOptions;
}
@Override
public String getQueryIdentifier(String sql) {
return sql;
}
@Override
public QueryParameterBindings getQueryParameterBindings() {
return QueryParameterBindings.NO_PARAM_BINDINGS;
}
@Override
public Callback getCallback() {
return callback;
}
}, getRowTransformer(), singleResultExpected ? ListResultsConsumer.UniqueSemantic.ASSERT : ListResultsConsumer.UniqueSemantic.FILTER);
if (list.isEmpty()) {
return null;
}
final T entity = list.get(0);
if (persister != null) {
callback.invokeAfterLoadActions(session, entity, persister);
}
return entity;
}
use of org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl in project hibernate-orm by hibernate.
the class SingleUniqueKeyEntityLoaderStandard method resolveId.
@Override
public Object resolveId(Object ukValue, SharedSessionContractImplementor session) {
final SessionFactoryImplementor sessionFactory = session.getFactory();
// todo (6.0) : cache the SQL AST and JdbcParameters
final List<JdbcParameter> jdbcParameters = new ArrayList<>();
final SelectStatement sqlAst = LoaderSelectBuilder.createSelectByUniqueKey(entityDescriptor, Collections.singletonList(entityDescriptor.getIdentifierMapping()), uniqueKeyAttribute, null, 1, LoadQueryInfluencers.NONE, LockOptions.NONE, jdbcParameters::add, sessionFactory);
final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory();
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(jdbcParameters.size());
int offset = jdbcParameterBindings.registerParametersForEachJdbcValue(ukValue, Clause.WHERE, uniqueKeyAttribute, jdbcParameters, session);
assert offset == jdbcParameters.size();
final JdbcSelect jdbcSelect = sqlAstTranslatorFactory.buildSelectTranslator(sessionFactory, sqlAst).translate(jdbcParameterBindings, QueryOptions.NONE);
final List<Object> list = sessionFactory.getJdbcServices().getJdbcSelectExecutor().list(jdbcSelect, jdbcParameterBindings, new ExecutionContext() {
@Override
public SharedSessionContractImplementor getSession() {
return session;
}
@Override
public QueryOptions getQueryOptions() {
return QueryOptions.NONE;
}
@Override
public String getQueryIdentifier(String sql) {
return sql;
}
@Override
public QueryParameterBindings getQueryParameterBindings() {
return QueryParameterBindings.NO_PARAM_BINDINGS;
}
@Override
public Callback getCallback() {
throw new UnsupportedOperationException("Follow-on locking not supported yet");
}
}, row -> row[0], ListResultsConsumer.UniqueSemantic.FILTER);
assert list.size() == 1;
return list.get(0);
}
use of org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl in project hibernate-orm by hibernate.
the class SqmUtil method createJdbcParameterBindings.
// public static JdbcParameterBindings buildJdbcParameterBindings(
// SqmStatement sqmStatement,
// JdbcParameterBySqmParameterAccess sqmInterpretation,
// ExecutionContext executionContext) {
// final DomainParameterXref domainParameterXref = DomainParameterXref.from( sqmStatement );
// final Map<QueryParameterImplementor<?>, Map<SqmParameter, List<JdbcParameter>>> jdbcParamsXref =
// generateJdbcParamsXref( domainParameterXref, sqmInterpretation );
// return createJdbcParameterBindings(
// executionContext.getDomainParameterBindingContext().getQueryParameterBindings(),
// domainParameterXref,
// jdbcParamsXref,
// executionContext.getSession()
// );
// }
// public static JdbcParameterBindings buildJdbcParameterBindings(
// SqmStatement sqmStatement,
// Map<QueryParameterImplementor<?>, Map<SqmParameter, List<JdbcParameter>>> jdbcParamsXref,
// ExecutionContext executionContext) {
// final DomainParameterXref domainParameterXref = DomainParameterXref.from( sqmStatement );
// return createJdbcParameterBindings(
// executionContext.getDomainParameterBindingContext().getQueryParameterBindings(),
// domainParameterXref,
// jdbcParamsXref,
// executionContext.getSession()
// );
// }
// public static JdbcParameterBindings buildJdbcParameterBindings(
// DomainParameterXref domainParameterXref,
// Map<QueryParameterImplementor<?>, Map<SqmParameter, List<JdbcParameter>>> jdbcParamsXref,
// ExecutionContext executionContext) {
// return createJdbcParameterBindings(
// executionContext.getDomainParameterBindingContext().getQueryParameterBindings(),
// domainParameterXref,
// jdbcParamsXref,
// executionContext.getSession()
// );
// }
public static JdbcParameterBindings createJdbcParameterBindings(QueryParameterBindings domainParamBindings, DomainParameterXref domainParameterXref, Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamXref, MappingMetamodel domainModel, Function<NavigablePath, TableGroup> tableGroupLocator, SqmParameterMappingModelResolutionAccess mappingModelResolutionAccess, SharedSessionContractImplementor session) {
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(domainParameterXref.getSqmParameterCount());
for (Map.Entry<QueryParameterImplementor<?>, List<SqmParameter<?>>> entry : domainParameterXref.getSqmParamByQueryParam().entrySet()) {
final QueryParameterImplementor<?> queryParam = entry.getKey();
final List<SqmParameter<?>> sqmParameters = entry.getValue();
final QueryParameterBinding<?> domainParamBinding = domainParamBindings.getBinding(queryParam);
final Map<SqmParameter<?>, List<List<JdbcParameter>>> jdbcParamMap = jdbcParamXref.get(queryParam);
for (SqmParameter<?> sqmParameter : sqmParameters) {
final Bindable parameterType = determineParameterType(domainParamBinding, queryParam, sqmParameters, mappingModelResolutionAccess, session.getFactory());
final List<List<JdbcParameter>> jdbcParamsBinds = jdbcParamMap.get(sqmParameter);
if (jdbcParamsBinds == null) {
// is replaced with an alias reference expression, which can happen for JPA Criteria queries
continue;
}
if (!domainParamBinding.isBound()) {
for (int i = 0; i < jdbcParamsBinds.size(); i++) {
final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get(i);
parameterType.forEachJdbcType((position, jdbcType) -> {
jdbcParameterBindings.addBinding(jdbcParams.get(position), new JdbcParameterBindingImpl(jdbcType, null));
});
}
} else if (domainParamBinding.isMultiValued()) {
final Collection<?> bindValues = domainParamBinding.getBindValues();
final Iterator<?> valueItr = bindValues.iterator();
// the original SqmParameter is the one we are processing.. create a binding for it..
for (int i = 0; i < jdbcParamsBinds.size(); i++) {
final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get(i);
createValueBindings(jdbcParameterBindings, queryParam, domainParamBinding, parameterType, jdbcParams, valueItr.next(), tableGroupLocator, session);
}
// an then one for each of the expansions
final List<SqmParameter<?>> expansions = domainParameterXref.getExpansions(sqmParameter);
assert expansions.size() == bindValues.size() - 1;
int expansionPosition = 0;
while (valueItr.hasNext()) {
final SqmParameter<?> expansionSqmParam = expansions.get(expansionPosition++);
final List<List<JdbcParameter>> jdbcParamBinds = jdbcParamMap.get(expansionSqmParam);
for (int i = 0; i < jdbcParamBinds.size(); i++) {
List<JdbcParameter> expansionJdbcParams = jdbcParamBinds.get(i);
createValueBindings(jdbcParameterBindings, queryParam, domainParamBinding, parameterType, expansionJdbcParams, valueItr.next(), tableGroupLocator, session);
}
}
} else if (domainParamBinding.getBindValue() == null) {
for (int i = 0; i < jdbcParamsBinds.size(); i++) {
final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get(i);
for (int j = 0; j < jdbcParams.size(); j++) {
final JdbcParameter jdbcParameter = jdbcParams.get(j);
jdbcParameterBindings.addBinding(jdbcParameter, new JdbcParameterBindingImpl(null, null));
}
}
} else {
if (domainParamBinding.getType() instanceof AttributeConverterTypeAdapter || domainParamBinding.getType() instanceof ConvertibleModelPart) {
final BasicValueConverter valueConverter;
final JdbcMapping jdbcMapping;
if (domainParamBinding.getType() instanceof AttributeConverterTypeAdapter) {
final AttributeConverterTypeAdapter<?> adapter = (AttributeConverterTypeAdapter<?>) domainParamBinding.getType();
valueConverter = adapter.getAttributeConverter();
jdbcMapping = adapter.getJdbcMapping();
} else {
final ConvertibleModelPart convertibleModelPart = (ConvertibleModelPart) domainParamBinding.getType();
valueConverter = convertibleModelPart.getValueConverter();
jdbcMapping = convertibleModelPart.getJdbcMapping();
}
if (valueConverter != null) {
final Object convertedValue = valueConverter.toRelationalValue(domainParamBinding.getBindValue());
for (int i = 0; i < jdbcParamsBinds.size(); i++) {
final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get(i);
assert jdbcParams.size() == 1;
final JdbcParameter jdbcParameter = jdbcParams.get(0);
jdbcParameterBindings.addBinding(jdbcParameter, new JdbcParameterBindingImpl(jdbcMapping, convertedValue));
}
continue;
}
}
final Object bindValue = domainParamBinding.getBindValue();
for (int i = 0; i < jdbcParamsBinds.size(); i++) {
final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get(i);
createValueBindings(jdbcParameterBindings, queryParam, domainParamBinding, parameterType, jdbcParams, bindValue, tableGroupLocator, session);
}
}
}
}
return jdbcParameterBindings;
}
Aggregations