Skip to content
Closed
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
c425f74
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Aug 13, 2025
886fe2b
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Aug 13, 2025
bb9f10a
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Aug 13, 2025
d2a38b6
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Aug 22, 2025
5e83e88
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 3, 2025
cc48369
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 3, 2025
ab378e6
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 10, 2025
2f6aefc
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 10, 2025
781edf2
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 10, 2025
05fabd9
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 10, 2025
f102781
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 10, 2025
7e71d65
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 10, 2025
ec48215
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 11, 2025
12e3a9a
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 11, 2025
98b71c7
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 16, 2025
2baa83f
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 18, 2025
4e747e3
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 18, 2025
6a145b0
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 18, 2025
3c500c7
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 19, 2025
7ce134f
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 19, 2025
cfbb96f
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 19, 2025
0491c6d
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 22, 2025
6b9d01d
HHH-19602 - Adjust JdbcOperation to allow more-than-one statement
sebersole Sep 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
import org.hibernate.sql.ast.tree.predicate.PredicateContainer;
import org.hibernate.sql.ast.tree.select.QuerySpec;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.results.internal.SqlSelectionImpl;
import org.hibernate.type.BasicType;
import org.hibernate.type.SqlTypes;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@ public RowLockStrategy getWriteRowLockStrategy() {

@Override
public OuterJoinLockingType getOuterJoinLockingType() {
return OuterJoinLockingType.UNSUPPORTED;
// Per Loic, as of 23 at least, Oracle does support this.
// Let's see what CI says for previous supported versions.
return OuterJoinLockingType.IDENTIFIED;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcSelectExecutor;
import org.hibernate.sql.results.graph.basic.BasicResult;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,9 @@ else if ( followOnStrategy == Locking.FollowOn.IGNORE ) {
}
}

if ( strategy != LockStrategy.FOLLOW_ON && needsLockingWrapper( querySpec ) && !canApplyLockingWrapper( querySpec ) ) {
if ( strategy != LockStrategy.FOLLOW_ON
&& needsLockingWrapper( querySpec, followOnStrategy )
&& !canApplyLockingWrapper( querySpec ) ) {
if ( followOnStrategy == Locking.FollowOn.DISALLOW ) {
throw new IllegalQueryOperationException( "Locking with OFFSET/FETCH is not supported" );
}
Expand Down Expand Up @@ -317,7 +319,11 @@ public void visitQueryGroup(QueryGroup queryGroup) {

@Override
public void visitQuerySpec(QuerySpec querySpec) {
final EntityIdentifierMapping identifierMappingForLockingWrapper = identifierMappingForLockingWrapper( querySpec );
final LockOptions lockOptions = getLockOptions();
final Locking.FollowOn followOnStrategy = lockOptions == null
? Locking.FollowOn.ALLOW
: lockOptions.getFollowOnStrategy();
final EntityIdentifierMapping identifierMappingForLockingWrapper = identifierMappingForLockingWrapper( querySpec, followOnStrategy );
final Expression offsetExpression;
final Expression fetchExpression;
final FetchClauseType fetchClauseType;
Expand Down Expand Up @@ -423,13 +429,13 @@ private QuerySpec createLockingWrapper(
return lockingWrapper;
}

private EntityIdentifierMapping identifierMappingForLockingWrapper(QuerySpec querySpec) {
private EntityIdentifierMapping identifierMappingForLockingWrapper(QuerySpec querySpec, Locking.FollowOn followOnStrategy) {
// We only need a locking wrapper for very simple queries
if ( canApplyLockingWrapper( querySpec )
// There must be the need for locking in this query
&& needsLocking( querySpec )
// The query uses some sort of pagination which makes the wrapper necessary
&& needsLockingWrapper( querySpec )
&& needsLockingWrapper( querySpec, followOnStrategy )
// The query may not have a group by, having and distinct clause, or use aggregate functions,
// as these features will force the use of follow-on locking
&& querySpec.getGroupByClauseExpressions().isEmpty()
Expand All @@ -450,9 +456,8 @@ private boolean canApplyLockingWrapper(QuerySpec querySpec) {
&& fromClause.getRoots().get( 0 ).getModelPart() instanceof EntityMappingType;
}

private boolean needsLockingWrapper(QuerySpec querySpec) {
final LockOptions lockOptions = getLockOptions();
if ( lockOptions.getFollowOnStrategy() == Locking.FollowOn.FORCE ) {
private boolean needsLockingWrapper(QuerySpec querySpec, Locking.FollowOn followOnStrategy) {
if ( followOnStrategy == Locking.FollowOn.FORCE ) {
// user explicitly asked for follow-on locking
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import org.hibernate.sql.exec.internal.StandardJdbcMutationExecutor;
import org.hibernate.sql.exec.spi.JdbcMutationExecutor;
import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcSelectExecutor;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,6 @@
*/
package org.hibernate.engine.spi;

import java.sql.Connection;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
import javax.naming.NamingException;
import javax.naming.Reference;
import jakarta.persistence.EntityGraph;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceUnitTransactionType;
Expand All @@ -21,7 +12,6 @@
import jakarta.persistence.SynchronizationType;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.TypedQueryReference;

import org.hibernate.CustomEntityDirtinessStrategy;
import org.hibernate.HibernateException;
import org.hibernate.Session;
Expand All @@ -37,12 +27,12 @@
import org.hibernate.engine.creation.spi.SessionBuilderImplementor;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.engine.profile.FetchProfile;
import org.hibernate.event.service.spi.EventListenerGroups;
import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EntityCopyObserverFactory;
import org.hibernate.event.spi.EventEngine;
import org.hibernate.graph.RootGraph;
import org.hibernate.generator.Generator;
import org.hibernate.graph.spi.RootGraphImplementor;
import org.hibernate.event.service.spi.EventListenerGroups;
import org.hibernate.metamodel.MappingMetamodel;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.spi.RuntimeMetamodelsImplementor;
Expand All @@ -56,11 +46,20 @@
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducerProvider;
import org.hibernate.stat.spi.StatisticsImplementor;
import org.hibernate.generator.Generator;
import org.hibernate.type.descriptor.WrapperOptions;
import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.spi.TypeConfiguration;

import javax.naming.NamingException;
import javax.naming.Reference;
import java.sql.Connection;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;

/**
* Base delegating implementation of the {@link SessionFactory} and
* {@link SessionFactoryImplementor} contracts for intended for easier
Expand Down Expand Up @@ -230,7 +229,7 @@ public SqlStringGenerationContext getSqlStringGenerationContext() {
}

@Override
public RootGraph<Map<String, ?>> createGraphForDynamicEntity(String entityName) {
public RootGraphImplementor<Map<String, ?>> createGraphForDynamicEntity(String entityName) {
return delegate.createGraphForDynamicEntity( entityName );
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EntityCopyObserverFactory;
import org.hibernate.event.spi.EventEngine;
import org.hibernate.graph.RootGraph;
import org.hibernate.graph.spi.RootGraphImplementor;
import org.hibernate.event.service.spi.EventListenerGroups;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
Expand Down Expand Up @@ -309,7 +308,7 @@ default <T> RootGraphImplementor<T> createEntityGraph(Class<T> entityType) {
}

@Override
RootGraph<Map<String, ?>> createGraphForDynamicEntity(String entityName);
RootGraphImplementor<Map<String, ?>> createGraphForDynamicEntity(String entityName);

/**
* The best guess entity name for an entity not in an association
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.query.spi.ScrollableResultsImplementor;
import org.hibernate.sql.results.jdbc.internal.JdbcValuesSourceProcessingStateStandardImpl;
import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl;
import org.hibernate.sql.results.jdbc.spi.JdbcValues;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingOptions;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingState;
import org.hibernate.sql.results.spi.RowReader;

/**
Expand All @@ -22,7 +22,7 @@
public abstract class AbstractScrollableResults<R> implements ScrollableResultsImplementor<R> {
private final JdbcValues jdbcValues;
private final JdbcValuesSourceProcessingOptions processingOptions;
private final JdbcValuesSourceProcessingStateStandardImpl jdbcValuesSourceProcessingState;
private final JdbcValuesSourceProcessingState jdbcValuesSourceProcessingState;
private final RowProcessingStateStandardImpl rowProcessingState;
private final RowReader<R> rowReader;
private final SharedSessionContractImplementor persistenceContext;
Expand All @@ -32,7 +32,7 @@ public abstract class AbstractScrollableResults<R> implements ScrollableResultsI
public AbstractScrollableResults(
JdbcValues jdbcValues,
JdbcValuesSourceProcessingOptions processingOptions,
JdbcValuesSourceProcessingStateStandardImpl jdbcValuesSourceProcessingState,
JdbcValuesSourceProcessingState jdbcValuesSourceProcessingState,
RowProcessingStateStandardImpl rowProcessingState,
RowReader<R> rowReader,
SharedSessionContractImplementor persistenceContext) {
Expand Down Expand Up @@ -62,7 +62,7 @@ protected JdbcValuesSourceProcessingOptions getProcessingOptions() {
return processingOptions;
}

protected JdbcValuesSourceProcessingStateStandardImpl getJdbcValuesSourceProcessingState() {
protected JdbcValuesSourceProcessingState getJdbcValuesSourceProcessingState() {
return jdbcValuesSourceProcessingState;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl;
import org.hibernate.sql.results.jdbc.internal.JdbcValuesSourceProcessingStateStandardImpl;
import org.hibernate.sql.results.jdbc.spi.JdbcValues;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingOptions;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingState;
import org.hibernate.sql.results.spi.LoadContexts;
import org.hibernate.sql.results.spi.RowReader;

Expand All @@ -31,7 +31,7 @@ public class FetchingScrollableResultsImpl<R> extends AbstractScrollableResults<
public FetchingScrollableResultsImpl(
JdbcValues jdbcValues,
JdbcValuesSourceProcessingOptions processingOptions,
JdbcValuesSourceProcessingStateStandardImpl jdbcValuesSourceProcessingState,
JdbcValuesSourceProcessingState jdbcValuesSourceProcessingState,
RowProcessingStateStandardImpl rowProcessingState,
RowReader<R> rowReader,
SharedSessionContractImplementor persistenceContext) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl;
import org.hibernate.sql.results.jdbc.internal.JdbcValuesSourceProcessingStateStandardImpl;
import org.hibernate.sql.results.jdbc.spi.JdbcValues;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingOptions;
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingState;
import org.hibernate.sql.results.spi.LoadContexts;
import org.hibernate.sql.results.spi.RowReader;

Expand All @@ -24,7 +24,7 @@ public class ScrollableResultsImpl<R> extends AbstractScrollableResults<R> {
public ScrollableResultsImpl(
JdbcValues jdbcValues,
JdbcValuesSourceProcessingOptions processingOptions,
JdbcValuesSourceProcessingStateStandardImpl jdbcValuesSourceProcessingState,
JdbcValuesSourceProcessingState jdbcValuesSourceProcessingState,
RowProcessingStateStandardImpl rowProcessingState,
RowReader<R> rowReader,
SharedSessionContractImplementor persistenceContext) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,15 @@
*/
package org.hibernate.internal;

import java.io.IOException;
import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serial;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.Function;
import javax.naming.Reference;
import javax.naming.StringRefAddr;

import jakarta.persistence.EntityGraph;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceException;
import jakarta.persistence.PersistenceUnitTransactionType;
import jakarta.persistence.PersistenceUnitUtil;
import jakarta.persistence.Query;
import jakarta.persistence.SynchronizationType;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.TypedQueryReference;
import org.hibernate.CustomEntityDirtinessStrategy;
import org.hibernate.EntityNameResolver;
import org.hibernate.FlushMode;
Expand Down Expand Up @@ -67,12 +56,11 @@
import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform;
import org.hibernate.event.monitor.internal.EmptyEventMonitor;
import org.hibernate.event.monitor.spi.EventMonitor;
import org.hibernate.event.service.spi.EventListenerGroups;
import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EntityCopyObserverFactory;
import org.hibernate.event.spi.EventEngine;
import org.hibernate.event.service.spi.EventListenerGroups;
import org.hibernate.generator.Generator;
import org.hibernate.graph.RootGraph;
import org.hibernate.graph.internal.RootGraphImpl;
import org.hibernate.graph.spi.RootGraphImplementor;
import org.hibernate.integrator.spi.Integrator;
Expand Down Expand Up @@ -113,14 +101,24 @@
import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.spi.TypeConfiguration;

import jakarta.persistence.EntityGraph;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceException;
import jakarta.persistence.PersistenceUnitTransactionType;
import jakarta.persistence.PersistenceUnitUtil;
import jakarta.persistence.Query;
import jakarta.persistence.SynchronizationType;
import jakarta.persistence.TypedQueryReference;
import javax.naming.Reference;
import javax.naming.StringRefAddr;
import java.io.IOException;
import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serial;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.Function;

import static jakarta.persistence.SynchronizationType.SYNCHRONIZED;
import static java.util.Collections.emptySet;
Expand Down Expand Up @@ -719,7 +717,7 @@ public boolean isOpen() {
}

@Override
public RootGraph<Map<String, ?>> createGraphForDynamicEntity(String entityName) {
public RootGraphImplementor<Map<String, ?>> createGraphForDynamicEntity(String entityName) {
final var entity = getJpaMetamodel().entity( entityName );
if ( entity.getRepresentationMode() != RepresentationMode.MAP ) {
throw new IllegalArgumentException( "Entity '" + entityName + "' is not a dynamic entity" );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
import org.hibernate.sql.exec.spi.Callback;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBinding;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.ast.tree.select.QuerySpec;
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.BaseExecutionContext;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.BaseExecutionContext;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
Expand Down
Loading
Loading