Skip to content

Commit 80b12c4

Browse files
committed
HHH-18535 - Support jakarta.persistence.EntityResult#lockMode
1 parent e574f88 commit 80b12c4

File tree

3 files changed

+19
-6
lines changed

3 files changed

+19
-6
lines changed

hibernate-core/src/main/java/org/hibernate/boot/query/SqlResultSetMappingDescriptor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import jakarta.persistence.ConstructorResult;
4747
import jakarta.persistence.EntityResult;
4848
import jakarta.persistence.FieldResult;
49+
import jakarta.persistence.LockModeType;
4950
import jakarta.persistence.SqlResultSetMapping;
5051

5152
import static org.hibernate.internal.util.collections.CollectionHelper.arrayList;
@@ -231,6 +232,7 @@ public static class EntityResultDescriptor implements ResultDescriptor {
231232
private final NavigablePath navigablePath;
232233
private final String entityName;
233234
private final String discriminatorColumn;
235+
private final LockModeType lockMode;
234236

235237
private final Map<String, AttributeFetchDescriptor> explicitFetchMappings;
236238

@@ -239,6 +241,7 @@ public EntityResultDescriptor(EntityResult entityResult) {
239241
this.navigablePath = new NavigablePath( entityName );
240242

241243
this.discriminatorColumn = entityResult.discriminatorColumn();
244+
this.lockMode = entityResult.lockMode();
242245

243246
this.explicitFetchMappings = extractFetchMappings( navigablePath, entityResult );
244247
}
@@ -288,7 +291,9 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext
288291

289292
return new ResultMementoEntityJpa(
290293
entityDescriptor,
291-
LockMode.READ,
294+
lockMode == LockModeType.OPTIMISTIC
295+
? LockMode.NONE
296+
: LockMode.fromJpaLockMode( lockMode ),
292297
discriminatorMemento,
293298
fetchMementos
294299
);

hibernate-core/src/main/java/org/hibernate/query/results/complete/CompleteResultBuilderEntityJpa.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.hibernate.query.results.ResultsHelper;
2222
import org.hibernate.query.results.dynamic.DynamicFetchBuilderLegacy;
2323
import org.hibernate.spi.NavigablePath;
24+
import org.hibernate.sql.ast.spi.SqlAliasBase;
2425
import org.hibernate.sql.results.graph.DomainResultCreationState;
2526
import org.hibernate.sql.results.graph.entity.EntityResult;
2627
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata;
@@ -90,6 +91,9 @@ public EntityResult buildResult(
9091
int resultPosition,
9192
BiFunction<String, String, DynamicFetchBuilderLegacy> legacyFetchResolver,
9293
DomainResultCreationState domainResultCreationState) {
94+
final String implicitAlias = entityDescriptor.getSqlAliasStem() + resultPosition;
95+
final SqlAliasBase sqlAliasBase = domainResultCreationState.getSqlAliasBaseManager().createSqlAliasBase( implicitAlias );
96+
9397
final DomainResultCreationStateImpl impl = ResultsHelper.impl( domainResultCreationState );
9498
impl.disallowPositionalSelections();
9599

@@ -103,8 +107,8 @@ public EntityResult buildResult(
103107
// since this is only used for result set mappings, the canUseInnerJoins value is irrelevant.
104108
true,
105109
navigablePath,
106-
null,
107-
null,
110+
implicitAlias,
111+
sqlAliasBase,
108112
null,
109113
impl.getSqlAstCreationState()
110114
)
@@ -113,7 +117,7 @@ public EntityResult buildResult(
113117
return new EntityResultImpl(
114118
navigablePath,
115119
entityDescriptor,
116-
null,
120+
implicitAlias,
117121
lockMode,
118122
(entityResult) -> {
119123
if ( discriminatorFetchBuilder == null ) {

hibernate-core/src/test/java/org/hibernate/orm/test/query/resultmapping/EntityResultTests.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919

2020
import jakarta.persistence.LockModeType;
2121
import org.hibernate.cfg.AvailableSettings;
22+
import org.hibernate.dialect.H2Dialect;
2223
import org.hibernate.query.named.NamedResultSetMappingMemento;
2324

2425
import org.hibernate.testing.orm.domain.gambit.EntityOfBasics;
2526
import org.hibernate.testing.orm.junit.DomainModel;
2627
import org.hibernate.testing.orm.junit.FailureExpected;
2728
import org.hibernate.testing.orm.junit.Jira;
29+
import org.hibernate.testing.orm.junit.RequiresDialect;
2830
import org.hibernate.testing.orm.junit.ServiceRegistry;
2931
import org.hibernate.testing.orm.junit.SessionFactoryScope;
3032
import org.hibernate.testing.orm.junit.Setting;
@@ -123,8 +125,10 @@ public void testImplicitAttributeMapping(SessionFactoryScope scope) {
123125
}
124126

125127
@Test
126-
@FailureExpected( jiraKey = "HHH-18535", reason = "Support for @EntityResult(lockMode) not implemented yet")
127-
@Jira( "https://hibernate.atlassian.net/browse/HHH-18535" )
128+
@RequiresDialect(
129+
value = H2Dialect.class,
130+
comment = "We don't really care about the execution on the database, just how the result-set is handled. Some databases (mssql) don't like this query"
131+
)
128132
public void testImplicitAttributeMappingWithLockMode(SessionFactoryScope scope) {
129133
scope.inTransaction(
130134
session -> {

0 commit comments

Comments
 (0)